2016-04-18 22 views
1

データアノテーション属性とIClientValidatableインターフェイスを2つの別々のアセンブリに配置して、懸念を分離したいと考えています。 1つはCommonと呼ばれ、もう1つはComman.Webです。ASP.netコアMVC 6データ注釈分離の問題

これらのリンクは、それがMVC 5でどのように動作するかを説明します。

Keeping IClientValidatable outside the model layer

http://www.eidias.com/blog/2012/5/25/mvc-custom-validator-with-client-side-validation

は残念ながらMVC 6で、それはASP.netでの作業はどのよう何

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(MyValidationAttribute), 
    typeof(MyValidationAttributeAdapter) 
); 

ありませんコアMVC 6?私はRC1を使用します。 Startup.cs

答えて

1

ConfigureServices方法で:

services.AddMvc(options => 
{ 
    options.ModelValidatorProviders.Insert(0, new CustomModelValidatorProvider()); 
}); 

あなたは、ASP.NETコア1.0 APIが変更されるようにコードを調整する必要があります。 DataAnnotationsModelValidatorProvider.cs

+0

お返事ありがとうございました。 あなたの例では、あなたは 'IModelValidatorProvider'を使います。しかし、私はここのようにレジスト 'IValidationAttributeAdapterProvider'をしたい: [ValidationAttributeAdapterProvider.cs](https://github.com/aspnet/Mvc/blob/144766f2e3ee802f50e143ee29d5ad654333a171/src/Microsoft.AspNetCore.Mvc.DataAnnotations/Internal/ValidationAttributeAdapterProvider.cs) 。 –

+0

これ以上のアイデアはありますか? –

+0

ASP.netコアRC2のアイデアはどこにありますか? –

0

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; 
    } 
} 
スタートアップConfigureServicesで

if (services.Any(f => f.ServiceType == typeof(IValidationAttributeAdapterProvider))) 
{ 
    services.Remove(services.Single(f => f.ServiceType == typeof(IValidationAttributeAdapterProvider))); 
} 
services.AddScoped<IValidationAttributeAdapterProvider, CustomValidationAttributeAdapterProvider>(); 
+0

ありがとうございました。それは動作します。 'IModelValidatorProvider'は何のためになっていますか? –

+0

私はまずIModelValidatorProviderを見ましたが、どのように動作するのか分かりません。私は自分自身のIModelValidatorProvider実装を登録することができましたが、CreateValidatorsが呼び出されるたびにValidatorItemsが存在しないので、本当に何もできませんでした。 –

関連する問題