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

Oma*_*mar 12 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" });
    }
}
Run Code Online (Sandbox Code Playgroud)

当用户在Nicknames文本区域中输入单行文本但将Name文本框留空时,仅显示RequiredName属性的错误消息.应该从该Validate()功能显示的错误消息永远不会显示.

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

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

mar*_*ind 18

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

  • 如果validate方法包含属性验证的结果,我们可以自己检查.即void IValidatableObject.Validate(List <ValidationResult> result,ValidationContext validationContext) (2认同)