2010-01-26 163 views
10

我希望能够发送JSON而不是标准的QueryStrings时,我的控制器在ASP.Net MVC的职位。我有前端的东西工作正常(建设,然后提交我的JSON对象)。ASP.Net MVC:发送JSON到控制器

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

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

另一种更好的方法是使用自定义模型活页夹。我所见过的所有人都假设你只有一个模型,而这将是一个类而不是一个变量。如果你有多个它打破。

有没有其他人遇到过这个?我的一个想法是,如果我可以简单地重写MVC如何处理FormCollection并拦截它,将自己的值添加到集合中,并希望MVC可以以正常的方式完成其余部分。有谁知道这是否可能?

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

如果我是正确的MVC从QueryString中获取值并将其放入表单集合中,然后用于ModelBinding。所以不应该改变FormCollection被分配的方式吗?的动作的

实施例:

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

正常结合作品,JSON不和模型绑定的所有的例子将不能工作。到目前为止,我的最佳解决方案是将对象转换为字典,并通过每个参数循环并匹配它。看起来并不理想。

+0

如果你打算投票,你可以解释为什么? – Damien 2010-01-27 12:18:07

+0

对不起,不幸的是,当我去点击最喜欢的明星时,即使在我已经提出了投票意见之后,我不小心点击了投票(这就是为什么它从5到3)。现在它试图撤销我意外做的事情后立即表示,除非修改问题,否则改变我的投票已经太晚了。如果你对这个问题进行编辑,我会很乐意修复我的投票。 – jamesaharvey 2010-01-27 14:39:43

+0

没问题!这也发生在我身上以及许多时候。 – Damien 2010-01-28 11:12:36

回答

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

你可以阅读更多关于此这里:Inheritance is Evil: The Epic Fail of the DataAnnotationsModelBinder

编辑

应将JsonModelBinder用作仅作为产品键入的控制器操作参数。 Int32和ClassObject应该回退到DefaultModelBinder。你遇到不同的结果吗?

+0

所以你需要定义使用它的类型? – Damien 2010-01-26 16:54:32

+0

是的,你必须指定类型。你能更详细地描述你的情况吗?我最近一直在深入研究模型绑定,其中有很多不明显的功能。 – 2010-01-26 17:03:48

+0

好了,我应该怎样处理基本类型/刺痛的动作参数?如果我发送Int32 ID,Class Product会产生问题 – Damien 2010-01-26 17:10:52

相关问题