使用数据注释以编程方式验证?
Programmatically validate using data annotations?
我有一个 属性 实体子class,我想验证它是否为空。
我无法使用 [Required]
属性对其进行注释,因为 EF 解析器会根据需要对其进行解释。我只希望这种类型需要它(它是一个继承的实体)。
问题是我在我的项目中使用了显示资源,我想从资源中检索 属性 名称和错误消息。
实体实现IValidatableObject
,所以我想添加Validator.TryValidateObject
并自动获取自定义验证错误,但它需要一个ValidationContext
的实例,其constructor我want to use, takes a Dictionary<object, object>
, 我不确定它需要什么参数。我确定这是我正在寻找的构造函数,因为我正在寻找一种方法来指定实例和成员名称,以便验证器自动提取显示变量。
我不介意以任何其他方式执行此操作,但我确实更喜欢一种开箱即用的方式,系统关心使用属性的显示名称和获取的错误消息来格式化验证错误来自资源。
不管怎样,我想问一下,Validator
class 是如何在内部获取显示名称的?是否公开了此功能的任何内容?
另一个问题是 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
。
我有一个 属性 实体子class,我想验证它是否为空。
我无法使用 [Required]
属性对其进行注释,因为 EF 解析器会根据需要对其进行解释。我只希望这种类型需要它(它是一个继承的实体)。
问题是我在我的项目中使用了显示资源,我想从资源中检索 属性 名称和错误消息。
实体实现IValidatableObject
,所以我想添加Validator.TryValidateObject
并自动获取自定义验证错误,但它需要一个ValidationContext
的实例,其constructor我want to use, takes a Dictionary<object, object>
, 我不确定它需要什么参数。我确定这是我正在寻找的构造函数,因为我正在寻找一种方法来指定实例和成员名称,以便验证器自动提取显示变量。
我不介意以任何其他方式执行此操作,但我确实更喜欢一种开箱即用的方式,系统关心使用属性的显示名称和获取的错误消息来格式化验证错误来自资源。
不管怎样,我想问一下,Validator
class 是如何在内部获取显示名称的?是否公开了此功能的任何内容?
另一个问题是 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
。