使用x-www-form-urlencoded而不是application / json进行POST时绑定JSON

时间:2012-10-25 15:31:22

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

使用DefaultModelBinder而不是x-www-form-urlencoded对数据进行POST时,有没有办法让application/json正常工作,但该值的实际有效负载是否为JSON编码?

例如,我正被发送一个键值对:

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

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

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

3 个答案:

答案 0 :(得分:0)

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

以下是一个例子:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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);
  }
}

现在,您可以使用CustomModelBinder属性跨行动重复使用Bind