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>
FormUrlEncodedMediaTypeFormatter
将 application/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 类型。
我创建了一个默认的 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>
FormUrlEncodedMediaTypeFormatter
将 application/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 类型。