c# - 使用数据注释以编程方式验证?

标签 c# entity-framework data-annotations validationattribute

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

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

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

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

我不介意以任何其他方式执行此操作,但我确实更喜欢一种开箱即用的方式,其中系统关心使用属性的显示名称和从资源。

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

最佳答案

看来我没有意识到,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

关于c# - 使用数据注释以编程方式验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29884999/

相关文章:

c# - x :Bind and nested class in a UWP application

c# - 带有 <example> 标记的数组类型不适用于 Swagger (swashbuckle.aspnetcore)

c# - 使用 C# 和 Entity Framework 将小浮点值插入 SQL Server

entity-framework - Entity Framework 4 POCO-延迟+渴望加载

c# - 带枚举的 RangeAttribute

c# - 为什么 Entity Framework 会尝试插入现有实体?

c# - Box 文件上传不设置 content_created_at 属性 c#

c# 如何在一行中使用 'return if not null'?

c# - 使用 linq/Entity Framework 查询多对多关系。代码优先

entity-framework - EF 4.4 InverseProperty 并不完全反转