【问题标题】:Programmatically validate using data annotations?使用数据注释以编程方式验证?
【发布时间】:2015-07-05 06:31:43
【问题描述】:

我有一个实体子类的属性,我想验证它是否为空。

我无法使用[Required] 属性对其进行注释,因为EF 解析器会根据需要对其进行解释。我只希望这种类型需要它(它是一个继承的实体)。

事情是我在我的项目中使用显示资源,我希望从资源中检索属性名称和错误消息。

实体实现了IValidatableObject,所以我想添加Validator.TryValidateObject并自动获取自定义的验证错误,但它需要一个ValidationContext的实例,我想使用它的constructor,需要一个Dictionary<object, object>,我不确定它需要什么论据。我确定这是我正在寻找的构造函数,因为我正在寻找一种方法来指定实例和成员名称,以便验证器自动提取显示变量。

我不介意以任何其他方式这样做,但我更喜欢一种开箱即用的方式,系统关心使用属性的显示名称和从资源。

无论如何,我想问一下,Validator 类如何在内部获取显示名称?是否有任何此功能公开?
另一个问题是ValidationContext 如何在内部设置MemberName?我可以自己构造这样的ValidationContext吗?

【问题讨论】:

    标签: c# entity-framework data-annotations validationattribute


    【解决方案1】:

    看起来我没有意识到,但ValidationContext.MemberName 属性是可读写的。

    我最终使用了以下内容:

    public IEnumerable<ValidationResult> IValidatableObject.Validate(
      ValidationContext validationContext)
    {
      var context = new ValidationContext(this) { MemberName = nameof(BirthDate) };
      var dateResults = new List<ValidationResult>();
      if (!Validator.TryValidateValue(this.BirthDate, context, dateResults,
        new[]
        { 
          new RequiredAttribute 
          {
            ErrorMessageResourceType = typeof(ValidationResx),
            ErrorMessageResourceName = Resx.Required 
          }
        }))
        foreach (var dateResult in dateResults)
          yield return dateResult;
    }
    

    我可以做的另一个选择是在DbContext.OnModelCreating 的流畅API 中将属性设置为NotRequired

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 1970-01-01
      • 2011-01-20
      • 2015-10-11
      • 2019-01-02
      • 1970-01-01
      • 2016-01-02
      • 2011-04-24
      • 1970-01-01
      相关资源
      最近更新 更多