[水煮ASP.NETWebAPI2方法论](1-3)如何接收HTML表单请求

问题

在武定等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站建设、做网站 网站设计制作定制设计,公司网站建设,企业网站建设,成都品牌网站建设,营销型网站,成都外贸网站建设公司,武定网站建设费用合理。

  我们想创建一个能够处理 HTML表单的 ASP.NET Web API应用程序(使用 application/x-www-form-urlencoded方式提交数据)。

 

解决方案

  我们可以创建一个 Controller Action 接收一个 Moddel,Model 的结构和准备从HTML 表单提交的准备处理的结构相似,模型绑定依赖于 ASP.NET Web API 来处理。模型中的属性名字和 HTTP 请求中要用的名字要匹配。

public HttpResponseMessage Post(RegistrationModel model)
{
    //忽略
}

 

  另外,我们可以使用System.Net.Http.Formatting.FormDataCollection作为 Action方法的唯一参数。框架将会通过键值对集合的方式传值,我们就可以自己处理我们想要的值。

public HttpResponseMessage Post(FormDataCollection form)
{
    //忽略
}

 

工作原理

  当使用 ASP.NET Web API构建 web应用程序时,为了提升现有 Web应用程序(MVC,Web Form,或者其他技术)而使用Web API的时候,提交 form-URL-encoded数据是一种很常见的需求。

  ASP.NET Web API使用 MediaTypeFormatters从 HttpRequestMessage表单中提取数据,并且,传输这些数据给相应选择的action来处理请求。第四章会详细介绍模型绑定和格式化,在这里,我们仅仅接触了直接与处理 HTML表单相关的概念。

   两个现成的格式化程序能够处理的格式:

  • FormUrlEncodedMediaTypeFormatter,用于绑定使用     application/x-www-form-urlencoded内容类型的 FormDataCollection。

  • JQueryMvcFormUrlEncodedFormatter,也是使用同样的内容类型,也可以绑定到Model(DTO)

从设计角度来看,后面的应该是前面的子类。

  使用FormDataCollection来代替我们action参数,他不仅让我们能够访问原始表单数据,还通知了 ASP.NET Web API不执行任何验证。

  默认情况,Web API仅仅读请求体一次,当使用模型绑定表单数据时,这种模式应该封装了所有的表单域。换句话说,不能在传输数据的时候,即使用请求体传输数据,同时又使用 URL参数形式传输数据,在这样的情况下,还希望框架自动处理模型绑定。对于 MVC开发者这个情况就很痛苦,因为他们习惯了这样的开发方式。不过,我们还是可以强制 Web API使用像 MVC样式的参数绑定。这部分将在本书 4-4部分讨论。

  如果你的表单处理的时二进制数据,例如,上传文件。这时候,表单将被替换为 multipart/form-data的形式提交。ASP.NET Web API没有提供任何内建的MediaTypeFomatter来处理二进制数据。不过,他还是很容易处理这种方式提交的表单。他是使用 MultipleFormDataStreamProvider来直接处理 HttpRequestMessage的内容。如清单 1-7所示。尽管处理文件上传超出了我们介绍的范围,还是会在 4-11单独讨论。

清单1-7. 接收复杂请求的表单数据

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 的时候,我们通常还是要处理传统的网页表单。

 

代码演示

清单1-8展示了使用简单表单和JavaScript提交到 ASP.NET Web API的简单网页表单.

 

清单 1-8. 简单的网页表单


    
        Name
        
    
             Email              
                  
                       提交     使用 JS 提交  $(     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         });      }); });

 清单 1-9展示了可以处理清单1-8表单的两个 ASP.NET Web API action。第一个是是使用相对传统的方式,使用 FormDataCollection和手动提取数据,然后在填充到服务器的模型里面。第二个依依赖与框架的自动模型绑定。

 

清单 1-9. Web API 控制器处理表单数据

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://scjbc.cn/article/gipihp.html