MVC3 Json Bind Bug?
本文关键字:Bug Bind Json MVC3 | 更新日期: 2023-09-27 18:07:08
我最近在为客户端实现JSON解决方案时遇到了一个问题。如果动作参数名与模型的属性名匹配,则绑定器无法绑定任何属性。
示例:
控制器的人
public ActionResult SetEmails(Person emails){
...
return Content("");
}
因为参数名被称为"email",并且它匹配Person模型的属性名"email"..粘合剂失效了,但没有给出任何原因。
他们有一个叫做Person的模型
public class Person {
public string Name { get; set; }
public List<string> Emails { get; set; }
public Person() {
Emails = new List<string>();
}
}
这是一个bug,还是一个"特性"?
作为旁注,我的问题更多的是关于参数名称如何导致绑定器的冲突?名称应该无关紧要,因为它是类类型,它定义了与json数据匹配的模式。绑定器为什么要关心参数的名称,或者它是否与参数本身的类类型中的属性名称相匹配?
问题是您的字典中有一个歧义,两个元素都命名为"email "(尽管大小写不同)。DefaultModelBinder
无法解决此歧义。
有两种可能的解决方案:(1)如果您要传回整个人员模型,将顶级元素的名称更改为"person"(考虑到上下文,这更有意义),这将消除歧义,并允许绑定按预期进行,或者(2)如果您只是传回电子邮件列表,将操作签名更改为public ActionResult SetEmails(List<Emails> emails)
。
我不会把你所经历的称为bug或特性,而是你的设计问题。
我不是说我喜欢这个答案,但是你可以避免改变你的属性名。
用参数的变量名包装JSON对象(在本例中为"email ")。
数据:JSON。stringify({email: {Name: "我的名字",email: ["a@a.com","b@b.com"]}});
,但这没有-模型绑定器返回null:
数据:JSON。stringify ({Name:"我的名字",邮件:["a@a.com"、"b@b.com"]});
仍然,这是相当蹩脚的。然而,事情在幕后工作,我的web客户端没有理由必须知道控制器中的参数名称是什么才能正确工作。据我所知,这是MVC模型绑定器中的一个错误。