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