覆盖asp.net核心1.1中的现有数据注释属性

Ali*_*liK 6 c# .net-core asp.net-core asp.net-core-1.1

我试图覆盖RequiredAttribute.net核心,似乎不适用于asp.net核心1.1

这是测试代码

public class CustomRequiredAttribute : RequiredAttribute
{
    public CustomRequiredAttribute():base()
    {

    }

    public override string FormatErrorMessage(string name)
    {
        return base.FormatErrorMessage(name);
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return base.IsValid(value, validationContext);
    }

}
Run Code Online (Sandbox Code Playgroud)

一旦在我的模型上使用,我期待正常的结果,就像field is required我还没有定制它,只是调用基本方法.

这似乎没有按预期工作,只是绕过了客户端和服务器端的要求.

这样做的目的是将从db中提取的验证消息添加到ErrorMessage属性中.

Axe*_*eer 3

您的问题是ValidationAttributeAdapterProvider,它是 的默认实现IValidationAttributeAdapterProvider,仅检查特定类型。因此,使用自定义实现会导致丢失“适配器提供程序”,从而导致丢失数据属性。

解决方案:提供您自己的实现IValidationAttributeAdapterProvider,它可以转发到非自定义内容的默认实现...

public class CustomValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider
{
    private IValidationAttributeAdapterProvider innerProvider = new ValidationAttributeAdapterProvider();

    public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer)
    {
        if (attribute == null)
            throw new ArgumentNullException(nameof(attribute));

        var type = attribute.GetType();

        if (type == typeof(CustomRequiredAttribute))
            return new RequiredAttributeAdapter((RequiredAttribute)attribute, stringLocalizer);

        return innerProvider.GetAttributeAdapter(attribute, stringLocalizer);
    }
}
Run Code Online (Sandbox Code Playgroud)

...并将其注册为单例。

services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();
Run Code Online (Sandbox Code Playgroud)