2011-01-22 63 views
10

在我的模型中,似乎Validate()仅在两个属性通过验证后才被调用。为什么仅在属性验证通过时调用IValidatableObject.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文本框为空,则仅显示为Name属性Required错误消息。应该从Validate()函数中显示的错误消息从不出现。

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

这是应该如何工作?在当前页面上导致错误时,用户在随后的页面上显示错误消息似乎很奇怪。

回答

14

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

+2

如果验证方法包含属性验证的结果,我们可以自己检查。即void IValidatableObject.Validate(List result,ValidationContext validationContext) – 2011-01-26 09:43:28

相关问题