我最近在为客户端实现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数据的类类型。为什么绑定器应该关注您为参数命名的内容,或者它是否与参数本身的类类型中的属性名称匹配?
答案 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模型绑定器中的一个错误。