MVC3 Json Bind Bug?

时间:2011-08-30 15:31:01

标签: c# asp.net-mvc json asp.net-mvc-3

我最近在为客户端实现JSON解决方案时遇到了问题。如果操作参数名称与模型的属性名称匹配,则绑定程序无法绑定任何属性。

一个例子:

Controller People

public ActionResult SetEmails(Person emails){
    ...
    return Content("");
}

因为参数名称被称为“电子邮件”并且匹配名为“电子邮件”的人员模型的属性名称..活页夹失败,但没有给出任何关于原因的指示..

他们有一个名为Person的模型

public class Person {
    public string Name { get; set; }
    public List<string> Emails { get; set; }

    public Person() {
        Emails = new List<string>();
    }
}

这是一个错误,还是一个'功能'?

正如旁注,我的问题更多的是关于参数名称如何导致与活页夹的冲突?名称应该无关紧要,因为它是定义它的模式以匹配json数据的类类型。为什么绑定器应该关注您为参数命名的内容,或者它是否与参数本身的类类型中的属性名称匹配?

2 个答案:

答案 0 :(得分:2)

问题在于你的词典含糊不清,两个元素都被命名为“电子邮件”(虽然有不同的大小写)。 DefaultModelBinder无法解决这种歧义。

两种可能的解决方案:(1)如果您传回一个完整的人模型,请将顶级元素的名称更改为“person”(根据上下文更有意义),这样可以消除歧义,并允许绑定按预期进行,或者(2)如果您只是传回电子邮件列表,请将您的操作签名更改为public ActionResult SetEmails(List<Emails> emails)

我不会将您遇到的错误或功能称为错误,但是您的设计存在问题。

答案 1 :(得分:0)

我不是说我喜欢这个答案,但你可以避免更改你的房产名称。

使用参数的变量名称包装您的JSON对象(在本例中,它是“电子邮件”)。所以这有效:

  

data:JSON.stringify({email:{Name:“my name”,电子邮件:[“a@a.com”,   “b@b.com”]}});

但这不是 - 模型绑定器返回null:

  

数据:JSON.stringify({姓名:“我的名字”,电子邮件:[“a@a.com”,“b @ b.com”]});

不过,这很糟糕。然而,事情深入人心,我的Web客户端无需知道控制器中的参数名称是什么才能正常工作。就我而言,这是MVC模型绑定器中的一个错误。