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数据匹配的模式。绑定器为什么要关心参数的名称,或者它是否与参数本身的类类型中的属性名称相匹配?

MVC3 Json Bind Bug?

问题是您的字典中有一个歧义,两个元素都命名为"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模型绑定器中的一个错误。