FormUrlEncodedMediaTypeFormatter 与 JQueryMvcFormUrlEncodedFormatter

FormUrlEncodedMediaTypeFormatter vs JQueryMvcFormUrlEncodedFormatter

我创建了一个默认的 Web api 项目,其中至少加载了这 2 个媒体格式化程序。两者都针对相同的内容类型:

FormUrlEncodedMediaTypeFormatter: application/x-www-form-urlencoded
JQueryMvcFormUrlEncodedFormatter: application/x-www-form-urlencoded

当我用 enctype="application/x-www-form-urlencoded" 做一个简单的 http post 表单时,它只适用于 JQueryMvcFormUrlEncodedFormatter,这意味着我发送的复杂对象在服务器端不为空。

当我在应用程序启动时删除格式化程序 JQueryMvcFormUrlEncodedFormatter 并再次执行简单的 http post 表单时,我希望它再次工作,但它没有。

我得到一个异常,没有加载合适的格式化程序。

事实并非如此-实际上-

为什么不起作用?

P.S.

我发现这就是区别:

– System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter, for handling HTML form URL-encoded data
– System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter, for handling model-bound HTML form URL-encoded data

但我不明白其中的区别!

我什至不使用 jquery 来 post 我的表格:

<form role="form" method="post" action="api/values"    enctype="application/x-www-form-urlencoded">
    <input type="text" class="form-control" name="firstName" placeholder="Enter first name">
    <input type="text" class="form-control" name="lastName" placeholder="Enter last name">
    <button type="submit" class="btn btn-default">Submit</button>
</form>

FormUrlEncodedMediaTypeFormatterapplication/x-www-form-urlencoded 主体绑定到 FormDataCollection 类型,并且仅限该类型。

JQueryMvcFormUrlEncodedFormatter 然而,使用可用的 ModelBinders 首先将主体解析为 FormDataCollection,然后使用第一个兼容的 ModelBinder 将其解析为最终模型。这就像混合模型绑定方法和媒体类型格式化方法,AFAIK 在 WebAPI 文档中的任何地方都没有解释。

默认情况下,两种格式化程序均已注册。这是我阅读 WebAPI 源代码的推断。

有 4 个开箱即用的格式化程序

  • JsonMediaTypeFormatter
  • XMLMediaTypeFormatter
  • FormUrlEncodedMediaTypeFormatter
  • JQueryMvcFormUrlEncodedFormatter

    前两个媒体类型格式化程序可以将 CLR 类型序列化和反序列化为 request/response,反之亦然。但是第三个既不序列化也不反序列化 to/from 任何 CLR 类型。第 4 个格式化程序可以将传入的原始数据反序列化为 CLR 类型。

    因此,在您的情况下,您在删除 JQueryMvcFormUrlEncodedFormatter 后遇到错误,因为第三个格式化程序无法将传入的请求数据反序列化为 CLR 类型。