Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NETMVC:向控制器发送JSON_Asp.net Mvc_Json_Model Binding - Fatal编程技术网

Asp.net mvc ASP.NETMVC:向控制器发送JSON

Asp.net mvc ASP.NETMVC:向控制器发送JSON,asp.net-mvc,json,model-binding,Asp.net Mvc,Json,Model Binding,在ASP.NETMVC中向控制器发送帖子时,我希望能够发送JSON,而不是标准的查询字符串。我的前端工作正常(构建并提交JSON对象) 问题在于控制器端,MVC框架附带的默认ModelBinder不支持这一点 我已经看到了多种方法的结合,其中之一是应用一个过滤器,将对象作为参数,使用JSON库对其进行反序列化,并将其添加到动作参数中。这并不理想 另一种更好的方法是使用自定义模型绑定器。但是,我看到的所有模型都假定只有一个模型,这将是一个类而不是一个变量。如果你有多个,它就会崩溃 还有其他人遇到过

在ASP.NETMVC中向控制器发送帖子时,我希望能够发送JSON,而不是标准的查询字符串。我的前端工作正常(构建并提交JSON对象)

问题在于控制器端,MVC框架附带的默认ModelBinder不支持这一点

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

另一种更好的方法是使用自定义模型绑定器。但是,我看到的所有模型都假定只有一个模型,这将是一个类而不是一个变量。如果你有多个,它就会崩溃

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

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

如果我是正确的,MVC将从QueryString中获取值,并将其放入表单集合中,然后用于模型绑定。因此,正确的方法不应该是更改FormCollection的分配方式吗

操作示例:

public ActionResult MyFirstAction(Int32 ID, PersonObject Person, ClassObject ClassDetails)
{
//etc
}

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

我对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);
    }
}
ModelBinders.Binders.Add(
    typeof(Product),
    new JsonModelBinder<Product>("ProductJson"));
公共类JsonModelBinder:IModelBinder{
私钥;
公共JsonModelBinder(字符串请求键){
this.key=requestKey;
}
公共对象绑定模型(ControllerContext ControllerContext,…){
var json=controllerContext.HttpContext.Request[key];
返回新的JsonSerializer()。反序列化(json);
}
}
然后将其连接到Global.asax.cs,如下所示:

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);
    }
}
ModelBinders.Binders.Add(
    typeof(Product),
    new JsonModelBinder<Product>("ProductJson"));
ModelBinders.Binders.Add(
(产品)类型,
新的JsonModelBinder(“ProductJson”);
您可以在此处阅读更多关于此的信息:

编辑


JsonModelBinder应仅用于类型为Product的控制器操作参数。Int32和ClassObject应该返回到DefaultModelBinder。您是否遇到了不同的结果?

因此您需要定义使用它的类型?是的,您必须指定类型。你能更详细地描述一下你的情况吗?我最近一直在深入研究模型绑定,其中有很多不明显的功能。对于类型,我该如何处理作为基本类型/Sting的操作参数?如果我发送的是Int32 ID,类产品,它会产生一个问题。你能用一个示例控制器操作更新你的问题吗?没有问题!补充说。干杯。如果你要投否决票,你能解释一下原因吗?抱歉,不幸的是,当我去点击最喜欢的明星时,我不小心点击了否决票,即使我已经投了赞成票(这就是为什么它从5票上升到3票)。现在,在试图撤销我的意外行为后,它立即表示,改变我的投票已经太晚了,除非这个问题得到编辑。如果你修改一下这个问题,我很乐意修改我的投票。没问题!我也经常遇到这种情况。我不知道发生了什么,但它仍然不让我决定我的投票。不,没关系。别担心。我真的不介意是否有人投票否决我,只要我知道原因,结果是一个错误。