MVC .net 核心:Validator.TryValidateObject 未验证伙伴 class 中定义的属性
MVC .net core: Validator.TryValidateObject is not validating attributes, defined in a buddy class
我们使用 DB-first 方法在 .NET Core 应用程序中生成模型。 DataAnnotations 被放在 "buddy" 元数据 class 中,以避免写入自动生成的文件。当控制器调用 TryValidateModel 时,一切正常,名称 属性 是必需的。
public partial class User
{
public string Name { get; set; }
}
[ModelMetadataType(typeof(UserMetaData))]
public partial class User : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { }
}
public class UserMetaData
{
[Required]
public string Name { get; set; }
}
在应用程序的服务层上,我们想要实施额外的验证,也就是检查对象在数据注释方面是否有效。这是通过
Validator.TryValidateObject()
它成功调用了 Validate 方法,但忽略了数据注释 - 用户有效,即使名称为空。
长话短说:
MVC(Web 项目)知道如何考虑通过 ModelMetadataType 属性放入 "buddy" class 中的数据注释,服务层项目则不会。
我以为我找到了答案here,但似乎
TypeDescriptor.AddProviderTransparent
不适用于 .net core 应用程序。
如有任何想法,我们将不胜感激。
我真的希望有一个单行解决方案:)
我滥用 ashrafs answer 他自己的问题是这样的:
var metadataAttr = typeof(T).GetCustomAttributes(typeof(ModelMetadataTypeAttribute), true).OfType<ModelMetadataTypeAttribute>().FirstOrDefault();
if (metadataAttr != null)
{
var metadataClassProperties = TypeDescriptor.GetProperties(metadataAttr.MetadataType).Cast<PropertyDescriptor>();
var modelClassProperties = TypeDescriptor.GetProperties(typeof(T)).Cast<PropertyDescriptor>();
var errs =
from metaProp in metadataClassProperties
join modelProp in modelClassProperties
on metaProp.Name equals modelProp.Name
from attribute in metaProp.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(modelProp.GetValue(model))
select new ValidationResult(attribute.FormatErrorMessage(Reflector.GetPropertyDisplayName<T>(metaProp.Name)), new[] { metaProp.Name });
validationResults.AddRange(errs);
}
我们使用 DB-first 方法在 .NET Core 应用程序中生成模型。 DataAnnotations 被放在 "buddy" 元数据 class 中,以避免写入自动生成的文件。当控制器调用 TryValidateModel 时,一切正常,名称 属性 是必需的。
public partial class User
{
public string Name { get; set; }
}
[ModelMetadataType(typeof(UserMetaData))]
public partial class User : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { }
}
public class UserMetaData
{
[Required]
public string Name { get; set; }
}
在应用程序的服务层上,我们想要实施额外的验证,也就是检查对象在数据注释方面是否有效。这是通过
Validator.TryValidateObject()
它成功调用了 Validate 方法,但忽略了数据注释 - 用户有效,即使名称为空。
长话短说: MVC(Web 项目)知道如何考虑通过 ModelMetadataType 属性放入 "buddy" class 中的数据注释,服务层项目则不会。
我以为我找到了答案here,但似乎
TypeDescriptor.AddProviderTransparent
不适用于 .net core 应用程序。
如有任何想法,我们将不胜感激。
我真的希望有一个单行解决方案:)
我滥用 ashrafs answer 他自己的问题是这样的:
var metadataAttr = typeof(T).GetCustomAttributes(typeof(ModelMetadataTypeAttribute), true).OfType<ModelMetadataTypeAttribute>().FirstOrDefault();
if (metadataAttr != null)
{
var metadataClassProperties = TypeDescriptor.GetProperties(metadataAttr.MetadataType).Cast<PropertyDescriptor>();
var modelClassProperties = TypeDescriptor.GetProperties(typeof(T)).Cast<PropertyDescriptor>();
var errs =
from metaProp in metadataClassProperties
join modelProp in modelClassProperties
on metaProp.Name equals modelProp.Name
from attribute in metaProp.Attributes.OfType<ValidationAttribute>()
where !attribute.IsValid(modelProp.GetValue(model))
select new ValidationResult(attribute.FormatErrorMessage(Reflector.GetPropertyDisplayName<T>(metaProp.Name)), new[] { metaProp.Name });
validationResults.AddRange(errs);
}