我试图覆盖.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
属性。
答案 0 :(得分:2)
您的问题是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>();