Asp.net mvc 4 ASP.MVC:JsonValueProviderFactory是否可以处理querystring变量?

Asp.net mvc 4 ASP.MVC:JsonValueProviderFactory是否可以处理querystring变量?,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,回到ASP.NET MVC 3的时代,我根据使用JsonValueProviderFactory将JSON数据作为查询字符串参数绑定到一个查询字符串 今天,我发现这不管用。在MVCWebAPI中,它们似乎只将发布的JSON数据绑定到强类型对象(请求体中的JSON),而不绑定查询字符串中的JSON数据 MVC4就是这样,还是我做错了什么 我的路线: routes.MapRoute( name: "CreateUser", url: "{controller}/CreateUser/

回到ASP.NET MVC 3的时代,我根据使用
JsonValueProviderFactory
将JSON数据作为查询字符串参数绑定到一个查询字符串

今天,我发现这不管用。在MVCWebAPI中,它们似乎只将发布的JSON数据绑定到强类型对象(请求体中的JSON),而不绑定查询字符串中的JSON数据

MVC4就是这样,还是我做错了什么

我的路线:

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

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

JsonValueProvider
仅当请求具有
contentType:application/json
时才会启用。如果您使用body
{CardNumber:“1111111”}
发送这样的请求,那么提供者将把它反序列化到一个字典中,DefaultModelBinder将很容易从中获取值