ASP.net核心MVC 6数据注释分离关注点



我想把数据注释属性和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>();

最新更新