回到ASP.NET MVC 3的那一天,我根据Phil Haack's Blog使用JsonValueProviderFactory
将JSON数据作为查询字符串参数绑定到strongly typed parameter。
今天,我发现这不起作用。在MVC Web API中,它们似乎只将POSTED JSON数据绑定到强类型对象(请求正文中的JSON),而不是查询字符串中的JSON数据。
这是MVC 4的情况还是我做错了什么?
我的路线:
routes.MapRoute(
name: "CreateUser",
url: "{controller}/CreateUser/{userAccount}",
defaults: new { action = "CreateUser"} );
我的方法:
public JsonResult CreateUser( MyObjectType userAccount)
{ /* user is null */ }
我的班级:
public class MyObjectType
{
public string CardNumber {get;set;}
}
更多测试:
// This completely fails, even if you URL Encode it:
localhost/CreateUser/{"CardNumber":"11111111"}
// Creates the object but all properties are null
localhost/CreateUser?{"CardNumber":"11111111"}
localhost/CreateUser?userAccount={"CardNumber":"11111111"}
我也尝试序列化对象的所有属性,即使我们不需要值,确保名称在拼写和大小写等方面相同。
我可以将参数作为字符串获取然后使用JSON.NET对其进行反序列化而不会出现问题,但我还想使用DataAnnotations
来检查ModelState.IsValid
。
答案 0 :(得分:2)
在您的情况下,似乎框架无法理解您传递给查询字符串的内容是JSON。路由数据值提供程序将继续对localhost/CreateUser/{"CardNumber":"11111111"}
进行请求,因此它将存储键值:userAccount={"CardNumber":"11111111"}
。然后,DefaultModelBinder将按键userAccount
请求一个值,并尝试将其绑定到MyObjectType
。在这个地方,他无法知道他得到的值是一个JSON字符串。
JsonValueProvider
时, contentType: application/json
才会参与。如果您使用正文{CardNumber:"1111111"}
发送此类请求,则提供程序会将其反序列化为字典,DefaultModelBinder将从该字典中轻松获取该值。