ASP.MVC:JsonValueProviderFactory是否与查询字符串变量一起使用?

时间:2013-05-16 18:23:43

标签: asp.net-mvc-4 asp.net-web-api

回到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

1 个答案:

答案 0 :(得分:2)

在您的情况下,似乎框架无法理解您传递给查询字符串的内容是JSON。路由数据值提供程序将继续对localhost/CreateUser/{"CardNumber":"11111111"}进行请求,因此它将存储键值:userAccount={"CardNumber":"11111111"}。然后,DefaultModelBinder将按键userAccount请求一个值,并尝试将其绑定到MyObjectType。在这个地方,他无法知道他得到的值是一个JSON字符串。

仅当请求JsonValueProvider时,

contentType: application/json才会参与。如果您使用正文{CardNumber:"1111111"}发送此类请求,则提供程序会将其反序列化为字典,DefaultModelBinder将从该字典中轻松获取该值。