我想把数据注释属性和IClientValidatable
接口放在两个独立的程序集中,以分离关注点。一个叫Common,另一个叫Comman.Web.
这些链接解释了它如何在MVC 5:中工作
在模型层之外保持IClientValidatable
http://www.eidias.com/blog/2012/5/25/mvc-custom-validator-with-client-side-validation
不幸的是,在MVC 6中没有
DataAnnotationsModelValidatorProvider.RegisterAdapter(
typeof(MyValidationAttribute),
typeof(MyValidationAttributeAdapter)
);
它是如何在ASP.net核心MVC 6中工作的?我使用RC1。
在Startup.cs
中,在ConfigureServices
方法中:
services.AddMvc(options =>
{
options.ModelValidatorProviders.Insert(0, new CustomModelValidatorProvider());
});
随着ASP.NET Core 1.0 API的更改,您必须调整代码。您可以在asp.net repo中找到一个示例实现:DataAnnotationsModelValidatorProvider.cs
在ASP.net核心1.0中,我可以通过替换IValidationAttributeAdapterProvider服务来做到这一点。
public class CustomValidationAttributeAdapterProvider : IValidationAttributeAdapterProvider
{
public IValidationAttributeAdapterProvider internalImpl;
public CustomValidationAttributeAdapterProvider()
{
internalImpl = new ValidationAttributeAdapterProvider();
}
public IAttributeAdapter GetAttributeAdapter(ValidationAttribute attribute, IStringLocalizer stringLocalizer)
{
IAttributeAdapter adapter = internalImpl.GetAttributeAdapter(attribute, stringLocalizer);
if (adapter == null)
{
var type = attribute.GetType();
if (type == typeof(CustomValidatorAttribute))
{
adapter = new CustomNumberValidatorAdapter((CustomValidatorAttribute)attribute, stringLocalizer);
}
}
return adapter;
}
}
启动时配置服务
if (services.Any(f => f.ServiceType == typeof(IValidationAttributeAdapterProvider)))
{
services.Remove(services.Single(f => f.ServiceType == typeof(IValidationAttributeAdapterProvider)));
}
services.AddScoped<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>();