2012-03-20 99 views
3

我有以下几点:MVC3比较属性和嵌套的对象属性

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的属性。

任何想法为什么这可以在客户端,但不是服务器?这种情况下的解决方案是什么?

非常感谢。

回答

2

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

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

如果可能将电子邮件地址属性放到视图模型上,然后再填充地址对象,那么这是最好的选择。