在ASP.Net MVC中发布给我的控制器时,我想要发送
JSON,而不是标准的QueryStrings.我有前端的东西工作正常(建立然后提交我的JSON对象).
问题出在控制器方面,MVC框架附带的默认ModelBinders不支持这一点.
我已经看到了一些方法,其中之一是应用一个将对象作为参数的过滤器,使用JSON库对其进行序列化,并将其添加到操作参数中.这不是理想的
另一个更好的方法是使用自定义的模型粘合剂.我所看到的所有这些都假设你将只有一个模型,它将是一个类而不是一个变量.如果你有多个它会分解.
有没有人遇到过这个?我有一个想法是,如果我可以简单地覆盖MVC如何处理FormCollection并在那里截取,将值添加到自己的集合中,并希望MVC能够以正常的方式执行其余操作.有人知道这是否可行?
我认为的关键问题是,我的问题并不具有约束力,因为我的观点模型与之前的方式没有什么不同.问题是从JSON Post获取值.
如果我是正确的MVC get是QueryString中的值,并将其放入表单集合中,然后将其用于ModelBinding.那么正确的方法是不是要改变FormCollection的分配方式呢?
举例说明:
public ActionResult MyFirstAction(Int32 ID,PersonObject Person,ClassObject ClassDetails) { //etc }
正常的绑定工作,JSON并不是所有的模型绑定器的例子也不会工作.到目前为止,我的最佳解决方案是将对象转换为字典,并循环遍历每个参数并进行匹配.似乎不理想
解决方法
我使用json这样的自定义模型binder:
public class JsonModelBinder<T> : IModelBinder { private string key; public JsonModelBinder(string requestKey) { this.key = requestKey; } public object BindModel(ControllerContext controllerContext,...) { var json = controllerContext.HttpContext.Request[key]; return new JsonSerializer().Deserialize<T>(json); } }
然后将它连接在Global.asax.cs中,如下所示:
ModelBinders.Binders.Add( typeof(Product),new JsonModelBinder<Product>("ProductJson"));
您可以在这里阅读更多:Inheritance is Evil: The Epic Fail of the DataAnnotationsModelBinder
编辑
控制器操作参数JsonModelBinder应该用作“仅产品”. Int32和ClassObject应该回到DefaultModelBinder.你有不同的结果吗?