net核心:Validator.TryValidateObject未验证在好友类中定义的属性



我们使用DB优先的方法在中生成模型。NET核心应用程序。DataAnnotations被放在"buddy"元数据类中,以避免在自动生成的文件中写入。当控制器调用TryValidateModel时,一切正常,Name属性是必需的。

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方法,但忽略了数据注释-用户是有效的,即使名称为空。

TL;博士:MVC(web项目(知道如何通过ModelMetadataType属性来考虑放在"buddy"类中的数据注释,而服务层项目则不知道。

我以为我在这里找到了答案,但似乎TypeDescriptor.AddProviderTransparent不适用于.net核心应用程序。

任何想法都将不胜感激。

我真的希望有一个单行解决方案:(

我辱骂阿什拉夫这样回答他自己的问题:

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);
}

相关内容

  • 没有找到相关文章

最新更新