【问题标题】:IValidatableObject Validate method runs twiceIValidatableObject Validate 方法运行两次
【发布时间】:2020-05-13 16:43:07
【问题描述】:

我有一个带有实体框架对象的模型。 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" });
        }
    }
}

【问题讨论】:

  • 你能展示你的模型吗?以及在控制器中使用和验证模型的代码?
  • 模型会在页面发布时自动验证,然后再执行任何控制器操作。完整的模型只是上面有一个 EF 对象和上面的 Validate 方法,没什么特别的。
  • @SLC 请检查(如果您还没有)stackoverflow.com/questions/10129669/…forums.asp.net/t/…
  • 第二个可能是正确的(不完全确定),但我找不到减轻它的方法。有什么想法吗?
  • @SLC 你能展示你的模型吗?它是否属于另一个经过验证的模型?

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


【解决方案1】:

我今天遇到了同样的问题……我相信这就是验证方法被调用 2 次的原因,from here

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

【讨论】:

    猜你喜欢
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多