为什么只有在属性验证通过时才调用IValidatableObject.Validate?

时间:2011-01-22 17:41:40

标签: asp.net validation asp.net-mvc-3

在我的模型中,似乎Validate()仅在两个属性都通过验证后被调用。

public class MyModel : IValidatableObject 
{
    [Required]
    public string Name { get; set;}

    [Required]
    public string Nicknames {get; set;}

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if(Nicknames != null && Nicknames.Split(Environment.NewLine.ToCharArray()).Count() < 2)
            return yield result new ValidationResult("Enter at least two nicknames, new [] { "Nicknames" });
    }
}

当用户在Nicknames文本区域中输入单行文本但将Name文本框保留为空时,只会显示Required属性的Name错误消息被展示。应从Validate()函数显示的错误消息永远不会显示。

只有在Name文本框中输入名称后,Nicknames文本中的某些文字才会调用Validate()函数。

它是如何工作的?当在当前页面上引起错误时,在后续页面上向用户显示错误消息似乎很奇怪。

1 个答案:

答案 0 :(得分:18)

这是设计的。在所有属性都通过验证之前,对象级验证不会触发,否则对象可能不完整。 Validate方法用于比较一个属性与另一个属性。在您的情况下,您应该编写自定义属性验证器。