問題

在武定等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網(wǎng)站建設、做網(wǎng)站 網(wǎng)站設計制作定制設計,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,成都品牌網(wǎng)站建設,營銷型網(wǎng)站,成都外貿網(wǎng)站建設公司,武定網(wǎng)站建設費用合理。
我們想創(chuàng)建一個能夠處理 HTML表單的 ASP.NET Web API應用程序(使用 application/x-www-form-urlencoded方式提交數(shù)據(jù))。
解決方案
我們可以創(chuàng)建一個 Controller Action 接收一個 Moddel,Model 的結構和準備從HTML 表單提交的準備處理的結構相似,模型綁定依賴于 ASP.NET Web API 來處理。模型中的屬性名字和 HTTP 請求中要用的名字要匹配。
public HttpResponseMessage Post(RegistrationModel model)
{
//忽略
}
另外,我們可以使用System.Net.Http.Formatting.FormDataCollection作為 Action方法的唯一參數(shù)??蚣軐ㄟ^鍵值對集合的方式傳值,我們就可以自己處理我們想要的值。
public HttpResponseMessage Post(FormDataCollection form)
{
//忽略
}
工作原理
當使用 ASP.NET Web API構建 web應用程序時,為了提升現(xiàn)有 Web應用程序(MVC,Web Form,或者其他技術)而使用Web API的時候,提交 form-URL-encoded數(shù)據(jù)是一種很常見的需求。
ASP.NET Web API使用 MediaTypeFormatters從 HttpRequestMessage表單中提取數(shù)據(jù),并且,傳輸這些數(shù)據(jù)給相應選擇的action來處理請求。第四章會詳細介紹模型綁定和格式化,在這里,我們僅僅接觸了直接與處理 HTML表單相關的概念。
兩個現(xiàn)成的格式化程序能夠處理的格式:
FormUrlEncodedMediaTypeFormatter,用于綁定使用 application/x-www-form-urlencoded內容類型的 FormDataCollection。
JQueryMvcFormUrlEncodedFormatter,也是使用同樣的內容類型,也可以綁定到Model(DTO)
從設計角度來看,后面的應該是前面的子類。
使用FormDataCollection來代替我們action參數(shù),他不僅讓我們能夠訪問原始表單數(shù)據(jù),還通知了 ASP.NET Web API不執(zhí)行任何驗證。
默認情況,Web API僅僅讀請求體一次,當使用模型綁定表單數(shù)據(jù)時,這種模式應該封裝了所有的表單域。換句話說,不能在傳輸數(shù)據(jù)的時候,即使用請求體傳輸數(shù)據(jù),同時又使用 URL參數(shù)形式傳輸數(shù)據(jù),在這樣的情況下,還希望框架自動處理模型綁定。對于 MVC開發(fā)者這個情況就很痛苦,因為他們習慣了這樣的開發(fā)方式。不過,我們還是可以強制 Web API使用像 MVC樣式的參數(shù)綁定。這部分將在本書 4-4部分討論。
如果你的表單處理的時二進制數(shù)據(jù),例如,上傳文件。這時候,表單將被替換為 multipart/form-data的形式提交。ASP.NET Web API沒有提供任何內建的MediaTypeFomatter來處理二進制數(shù)據(jù)。不過,他還是很容易處理這種方式提交的表單。他是使用 MultipleFormDataStreamProvider來直接處理 HttpRequestMessage的內容。如清單 1-7所示。盡管處理文件上傳超出了我們介紹的范圍,還是會在 4-11單獨討論。
清單1-7. 接收復雜請求的表單數(shù)據(jù)
public async Task Post()
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable,
"請求格式化失敗"));
}
var streamProvider = new MultipartFormDataStreamProvider("d:/uploads/");
await Request.Content.ReadAsMultipartAsync(streamProvider);
//訪問 FormDataCollection 的 實例 streamProvider.FormData
}注意在這一部分討論的功能不是 ASP.NET特有的,Web API 之外一樣可以用。不過,作為 ASP.NET Web 應用程序的一部分來運行 Web API 的時候,我們通常還是要處理傳統(tǒng)的網(wǎng)頁表單。
代碼演示
清單1-8展示了使用簡單表單和JavaScript提交到 ASP.NET Web API的簡單網(wǎng)頁表單.
清單 1-8. 簡單的網(wǎng)頁表單
<form role="form" method="post" action="/api/form" enctype="application/x-www-form-urlencoded">
<div class="form-group">
<label for="name">Name</label>
<input type="text" class="form-control" name="name" placeholder="Enter name">
</div>
<div class="form-group">
<label for="email">Email</label>
<input type="email" class="form-control" name="email" placeholder="Enter email">
</div>
<div class="radio">
<label>
<input type="radio" name="gender" value="female" checked>Female
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="gender" value="male">Male
</label>
</div>
<button type="submit" class="btn btn-default">提交</button>
<button id="postJS" class="btn btn-default">使用 JS 提交</button>
</form>
<script type="text/javascript"> $(
function () {
$("#postJS").on("click", function () {
var data = { name: $("input[name='name']").val(),
email: $("input[name='email']").val(),
gender: $("input[name='gender']:checked").val(), };
$.ajax(
{
data: data,
datatype: "html",
type: "POST",
url: "/api/user"
}).done(function (res) {
//處理 handler
});
});
});
</script>清單 1-9展示了可以處理清單1-8表單的兩個 ASP.NET Web API action。第一個是是使用相對傳統(tǒng)的方式,使用 FormDataCollection和手動提取數(shù)據(jù),然后在填充到服務器的模型里面。第二個依依賴與框架的自動模型綁定。
清單 1-9. Web API 控制器處理表單數(shù)據(jù)
public async Task Post()
{
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable,
"請求格式化失敗"));
}
var streamProvider = new MultipartFormDataStreamProvider("d:/uploads/");
await Request.Content.ReadAsMultipartAsync(streamProvider);
//訪問 FormDataCollection 的 實例 streamProvider.FormData
}
public class UserModel{
public string Name { get; set; }
public string Email { get; set; }
public string Gender { get; set; }
}
public class FormController : ApiController{
public HttpResponseMessage Post(FormDataCollection form)
{
var user = new UserModel {
Email = form["Email"],
Name = form["Name"],
Gender = form["Gender"]
};
// 處理用戶...
// 忽略
}
}
public class UserController : ApiController{
public HttpResponseMessage Post(UserModel user)
{
//process user...
//rest omitted for brevity
}
}
分享名稱:[水煮ASP.NETWebAPI2方法論](1-3)如何接收HTML表單請求
本文地址:http://www.yijiale78.com/article48/gipihp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設計公司、Google、服務器托管、移動網(wǎng)站建設、網(wǎng)站設計公司、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)