【问题标题】:ASP.MVC: Does JsonValueProviderFactory work with querystring variables?ASP.MVC:JsonValueProviderFactory 是否适用于查询字符串变量?
【发布时间】:2013-06-19 13:10:48
【问题描述】:

在 ASP.NET MVC 3 时代,我使用 JsonValueProviderFactory 按照 Phil Haack's Blog 将 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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 2017-01-06
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多