IValidatableObject Validate方法运行两次

时间:2015-08-19 09:14:45

标签: c# asp.net-mvc asp.net-mvc-5 model-validation

我有一个带有Entity Framework对象的模型。 EF对象实现IValidatableObject并且在其上有一个Validate()方法。

由于某种原因,该方法运行两次,因此我的页面上出现两个相同的模型错误。

知道为什么会发生这种情况或者如何阻止它?

我尝试添加_isValidated私有成员变量,但每次运行时它似乎都会重置为false,因此它必须创建并验证模型的两个实例。

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
    if (string.IsNullOrWhiteSpace(CatName))
    {
        yield return new ValidationResult("Bad kitty", new string[] { "CatName", "CatName" });
    }
}

编辑:我的模特:

    public class KittyModel
    {
        public Cat Cat { get; set; }

        public int? SomeId { get; set; }

        public string SomeString { get; set; }
    }

然后Cat只是一个EF对象

    [MetadataType(typeof(CatMetadata))]
    public partial class Cat : IValidatableObject
    {
    public sealed class CatMetadata
    {
        [Required]
        public int? CatTypeID { get; set; }
    }

    // Some other get; only properties here

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (string.IsNullOrWhiteSpace(CatName))
        {
            yield return new ValidationResult("Bad kitty", new string[] { "CatName", "CatName" });
        }
    }
}

1 个答案:

答案 0 :(得分:2)

我今天遇到了同样的问题...我相信这就是将验证方法称为from here两次的原因:

  

如果您的模型是复杂模型中的复杂模型,请进行验证   可能会被模型级验证程序调用两次(   IValidatableObject被认为是)。那是因为它已经过验证   一次作为独立对象,然后再次作为其对象的属性   包含对象。