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

9

我希望在向ASP.Net MVC控制器发出POST请求时,能够发送JSON而不是标准的查询字符串。我的前端工作正常运行(构建并提交我的JSON对象)。

问题出现在控制器方面,MVC框架默认提供的ModelBinders不支持此操作。

我看到了一些解决方法,其中之一是应用一个过滤器,将对象作为参数传递,使用JSON库对其进行反序列化,并将其添加到操作参数中。但这不是理想的方法。

另一种更好的方法是使用自定义Model Binder。但我看到的所有方式都假定您只有一个模型,而且它将是一个类而不是一个变量。如果您有多个模型,则会出现问题。

有没有其他人遇到过这个问题?我想到的一个想法是,如果我可以简单地覆盖MVC处理FormCollection的方式并在那里拦截,将值添加到集合中,然后希望MVC可以以正常方式完成剩下的工作。请问这是否可行?

我认为关键问题在于,我的问题不在于绑定,因为我的视图模型与以前的模型没有任何区别。问题在于从JSON Post获取值。

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

操作示例:

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

正常的数据绑定可以工作,但JSON格式无法绑定,而且所有模型绑定的示例也都无法使用。目前我能想到的最好解决方法是将对象转换为字典,并循环遍历每个参数并进行匹配。这似乎不太理想。

如果您要投反对票,能否解释一下原因? - Damien
抱歉,当我想要点击收藏星标时,我不小心点了踩,即使我已经点了赞(这就是为什么它从5变成了3)。现在,在试图撤销我不小心做的事情后,它立即说除非问题被编辑,否则无法更改我的投票。如果您对问题进行编辑,我将很乐意修正我的投票。 - jamesaharvey
没问题!这种情况我也经常遇到。 - Damien
我不知道发生了什么事,但它仍然不让我修复我的投票。 - jamesaharvey
没关系。别担心。如果我知道为什么,我并不介意被投反对票,结果证明只是一个错误。 - Damien
1个回答

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

然后在Global.asax.cs中将其连接起来,像这样:

ModelBinders.Binders.Add(
    typeof(Product),
    new JsonModelBinder<Product>("ProductJson"));

你可以在这里阅读更多相关内容:继承是一种错误:DataAnnotationsModelBinder的史诗级失败 修改 在控制器操作参数类型为Product时,应使用JsonModelBinder。Int32和ClassObject应回退到DefaultModelBinder。你是否遇到了不同的结果?

所以你需要定义要在哪些类型上使用它? - Damien
是的,您必须指定类型。您能否更详细地描述一下您的情况?最近我一直在深入研究模型绑定,其中有很多非显而易见的功能。 - Mike Valenty
对于类型,我该如何处理原始类型/字符串的操作参数?如果我发送Int32 ID、Class Product,会出现问题。 - Damien
你能否更新你的问题并提供一个控制器动作的示例? - Mike Valenty
没问题!已添加。干杯。 - Damien
是的,我(遇到了不同的结果)。基本上发送到操作的JSON对象没有填充任何内容。如果我发送 { "ID" : 34 } 并且 ID 是唯一的操作,它将无法映射。这些是普通实体,只是我想通过JSON发送数据,而MVC无法理解。 - Damien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接