asp.net-mvc – ASP.Net MVC:发送JSON到控制器

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – ASP.Net MVC:发送JSON到控制器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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.你有不同的结果吗?

猜你在找的asp.Net相关文章