【问题标题】:Binding JSON when POSTed with x-www-form-urlencoded not application/json使用 x-www-form-urlencoded 而非 application/json 发布时绑定 JSON
【发布时间】:2012-10-25 15:31:22
【问题描述】:

当使用x-www-form-urlencoded 而不是application/json 发布数据时,有没有办法让DefaultModelBinder 工作,但该值的实际有效负载是 JSON 编码的?

例如,我收到一个键值对:

key: 'events' 
value: '[{"event":"inbound","ts":1350928095,"msg":{"raw_msg":"Received"}}]'

在这种情况下,值包含 JSON 数组。

注意:POST 来自第 3 方,因此我无法控制。

【问题讨论】:

  • 我自己会更改它,但是在接受编辑之前,您需要更改最少数量的字符。我不想为了更快地满足我的强迫症而改写你的问题;)

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


【解决方案1】:

我不这么认为。您可以将客户端更改为发布 application/json 内容类型或编写自定义模型绑定器。

【讨论】:

    【解决方案2】:

    一般来说,答案是“当然。只需使用 'NAME=VALUE'(例如 'data=MYJSON'),并且不要忘记在发送之前进行编码。”

    这是一个例子:

    但是,重新阅读您的问题,您使用的是 MVC4。这可能会对简单的 C# 或 Java 程序施加限制:(

    【讨论】:

      【解决方案3】:

      如果您需要在单个操作中实现此行为,请使用 JavaScriptSerializer 将 JSON 内容反序列化为集合,并使用 UpdateModel/TryUpdateModel 方法验证集合。

      如果您需要许多操作,那么您必须通过继承 DefaultModelBinder 并覆盖 CreateModel 方法来使用自定义模型绑定器。在CreateModel 方法中,使用JavaScriptSerializer 从POST 值创建对象。

      public class CustomModelBinder: DefaultModelBinder
      {
         protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType)
        {
           // JavaScriptSerializer serializer = new JavaScriptSerializer();
           // return serializer.DeserializeObject(read the value from request);
        }
      }
      

      现在您可以使用 Bind 属性跨操作重复使用 CustomModelBinder

      【讨论】:

        猜你喜欢
        • 2023-03-21
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 2016-04-13
        • 2012-04-09
        • 1970-01-01
        相关资源
        最近更新 更多