我正在尝试覆盖.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/