我正在尝试覆盖.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这样的正常结果,因为我尚未自定义它,而只是调用了基本方法。

这似乎无法正常工作,只是绕过了客户端和服务器端的要求。

这样做的目的是将从数据库拉出的验证消息添加到ErrorMessage属性。

最佳答案

您的问题是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);
    }
}

...并将其注册为单例。
services.AddSingleton<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();

关于c# - 覆盖ASP.NET Core 1.1中的现有数据注释属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41295292/

10-15 22:17
查看更多