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

时间:2016-12-23 04:43:06

标签: c# asp.net-core .net-core asp.net-core-1.1

我试图覆盖.net核心中的RequiredAttribute,似乎无法在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);
    }

}

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

这似乎没有按预期工作,只是绕过客户端和服务器端的必需。

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

1 个答案:

答案 0 :(得分:2)

您的问题是ValidationAttributeAdapterProviderIValidationAttributeAdapterProvider的默认实现,仅检查特定类型。因此,使用自定义实现会导致缺少"适配器提供程序",这会导致缺少数据属性。

解决方案:提供您自己的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);
    }
}

...并将其注册为单身人士。

services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();