ASP.Net MVC:向控制器发送JSON

Dam*_*ien 9 asp.net-mvc json model-binding

我希望能够在ASP.Net MVC中向我的控制器发布帖子时发送JSON而不是标准的QueryStrings.我有前端工作正常(构建然后提交我的JSON对象).

问题出在控制器端,MVC框架附带的默认ModelBinder不支持此功能.

我已经看到了各种方法,其中之一是应用一个过滤器,它将对象作为参数,使用JSON库对其进行反序列化,并将其添加到操作参数中.这不太理想.

另一种更好的方法是使用自定义Model Binder.我见过的所有人都认为你只有一个模型而且它将是一个类而不是一个变量.如果你有多个,它会崩溃.

有人遇到过这种情况么?我有一个想法,如果我可以简单地覆盖MVC如何处理FormCollection并拦截那里,我自己将值添加到集合中,并希望MVC能够以正常的方式完成剩下的工作.有谁知道这是否可能?

我认为关键问题是我的问题不在于绑定,因为我的视图模型与之前的模型没有什么不同.问题是从JSON Post获取值.

如果我是正确的MVC获取QueryString中的值并将其放入表单集合中,然后将其用于ModelBinding.那么正确的方法是不应该改变FormCollection的分配方式?

动作示例:

public ActionResult MyFirstAction(Int32 ID, PersonObject Person, ClassObject ClassDetails)
{
//etc
}
Run Code Online (Sandbox Code Playgroud)

正常的绑定工作,JSON没有,模型绑定器的所有示例都不起作用.到目前为止,我最好的解决方案是将对象转换为字典并循环遍历每个参数并匹配它.看起来不太理想.

Mik*_*nty 8

我为json使用自定义模型绑定器,如下所示:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后将它连接到Global.asax.cs中,如下所示:

ModelBinders.Binders.Add(
    typeof(Product),
    new JsonModelBinder<Product>("ProductJson"));
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读更多相关内容:继承是邪恶的:DataAnnotationsModelBinder的Epic Fail

编辑

应将JsonModelBinder用于仅作为Product键入的控制器操作参数.Int32和ClassObject应该回退到DefaultModelBinder.您是否遇到了不同的结果?