MVC3比较属性和嵌套对象属性

时间:2012-03-20 10:00:44

标签: c# .net asp.net-mvc-3 validation jquery-validate

我有以下内容:

public class Address 
{
    public string Email { get; set; }
}

public class CheckoutViewModel 
{
    public Address Address { get; set; }

    [Compare("Address.Email", ErrorMessage = "The email addresses you entered do not match")]
    public string ConfirmEmailAddress { get; set; }
}

使用客户端JS,这可以正确地处理和验证。但是,在未启用Javascript的情况下进行测试时,表单会回发,但ModelState错误显示为:

  

找不到名为Address.Email的属性。

有关为何在客户端而非服务器上运行的任何想法?在这种情况下解决方案是什么?

非常感谢。

1 个答案:

答案 0 :(得分:2)

如果您查看生成的HTML源代码,您会发现Email的输入元素称为“Address.Email”,这就是验证在客户端工作的原因。

然而,看起来该属性不是为了处理嵌套属性而构建的,因此在服务器级别它不起作用(因为没有名为“Address.Email”的属性)。因此,您需要确保两个属性处于同一级别(在ViewModel上或同时在Address类上)。

您可能最好选择将电子邮件地址属性放到视图模型上,然后再填充地址对象。