3

早在 ASP.NET MVC 3 时代,我JsonValueProviderFactory按照Phil Haack 的博客将 JSON 数据作为查询字符串参数绑定到强类型参数

今天,我发现这行不通。在 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.

4

1 回答 1

2

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

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

于 2013-06-19T05:10:48.407 回答