2016-11-03 10 views
1

私はasp.netでmvcアプリケーションを作成しています。モデルに自分のコントローラを投稿したときに検証メッセージを受け取るために、このメンバでdataAttributeが必要なviewModelを作成しました。これはうまくいきます。オーバーライドmvcの必要なデータ属性

これで、errorMessageの変換を指定するために、Validateメソッドをオーバーライドしたいと考えています。私はキーの翻訳を得るためにカスタムフレームワークを使って作業しています。

表現可能な注釈を使用するには、必須のdataAttributeをオーバーライドする必要があります。ここで

私はその後、私にErrorMessageに

をtranslationKeyを置くコード

のViewModel

public class SocietyInformationViewModel 
{ 
    [Required(ErrorMessage = "5614")] 
    public string Name { get; set; } 
} 

ですが、私はカスタムModelValidatorとカスタムModelValidatorProvider

ModelValidatorを作成しました

public class LocalizableDataAnnotationsModelValidator : ModelValidator 
{ 
    private ModelValidator _innerValidator; 
    private ModelMetadata _metadata; 

    public LocalizableDataAnnotationsModelValidator(ModelValidator innerValidator, ModelMetadata metadata, ControllerContext controllerContext) 
     : base(metadata, controllerContext) 
    { 
     _innerValidator = innerValidator; 
     _metadata = metadata; 
    } 

    public override IEnumerable<ModelValidationResult> Validate(object container) 
    { 
     Service.TranslationService LocalizationManager = new Service.TranslationService(); 

     // execute the inner validation which doesn't have localization 
     var results = _innerValidator.Validate(container); 

     // convert the error message (which should be the localization resource key) to the localized value through the ILocalizationResourceProvider 
     return results.Select((result) => 
     { 
      string message = result.Message; 
      int key = 0; 

      if (Int32.TryParse(result.Message, out key)) 
       message = LocalizationManager.Get(key, ""); 

      return new ModelValidationResult() { Message = string.Format(message, _metadata.DisplayName) }; 
     }); 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     Service.TranslationService LocalizationManager = new Service.TranslationService(); 
     var somerules = _innerValidator.GetClientValidationRules().ToList(); 

     foreach (var rule in somerules) 
     { 
      int key = 0; 
      if (rule.ErrorMessage != null && rule.ErrorMessage.Length >= 3 && rule.ErrorMessage.Length <= 5 && Int32.TryParse(rule.ErrorMessage, out key)) 
       rule.ErrorMessage = LocalizationManager.Get(key, ""); 
     } 

     return somerules; 
    } 
} 

ModelValidatorProvider

public class LocalizableDataAnnotationsModelValidatorProvider : DataAnnotationsModelValidatorProvider 
{ 
    public LocalizableDataAnnotationsModelValidatorProvider() 
     : base() 
    { 
    } 

    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes) 
    { 
     var validators = base.GetValidators(metadata, context, attributes); 
     var cnt = validators.Count(); 
     var result = new List<LocalizableDataAnnotationsModelValidator>(); 
     foreach (var validator in validators) 
     { 
      result.Add(new LocalizableDataAnnotationsModelValidator(validator, metadata, context)); 
     } 
     return result; 
    } 
} 

そして今、私はこのように行う場合は、実行時に、私は次の例外

を持ってapplicationStart

private void RegisterModelProviders() 
    { 
     // register the model metadata provider 
     //ModelMetadataProviders.Current = new LocalizableDataAnnotationsModelMetadataProvider(); 

     //// register the model validation provider 
     var provider = ModelValidatorProviders.Providers.Where(p => p.GetType() == typeof(DataAnnotationsModelValidatorProvider)).FirstOrDefault(); 

     DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 

     if (provider != null) 
     { 
      ModelValidatorProviders.Providers.Remove(provider); 
     } 

     //ModelValidatorProviders.Providers.Clear(); 
     provider = new LocalizableDataAnnotationsModelValidatorProvider(); 
     ModelValidatorProviders.Providers.Add(provider); 
    } 

上のglobal.asaxでRegisterModelProvidersを呼び出します

控えめなクライアント検証ルールの検証タイプ名は一意でなければなりません。次の検証タイプは複数回見ました:必要な

だから私は、ウェブ上で検索し、私は私のweb.configファイルを変更してきたと虚偽のClientValidationEnabledキーに設定することを言うコメントこのarticleを見つけました。私はそれをやった、と

は私が失わ少しだ...エラーは消えていませんでしたが、私のmodelValidorはもう呼ばれ、任意のヘルプは===

======更新歓迎です====

Ninjectを使用すると、NinjectDataAnnotationsModelValidatorProviderが追加されることがわかりました。私はメッセージ

を持っているだからこそ、次の検証タイプは複数回見ました:必要な

だから私はNinjectDataAnnotationsModelValidatorProviderを削除しようとするが、私はそれのために任意の解決策を見つけることができません。

======アップデート2 =======

前の問題を解決するために、私はgithubの上Ninject.Web.Mvcプロジェクトをダウンロードして、私の解決策に含めます。次に、この行を削除します(MvcModuleから削除します)。CS)

this.Kernel.Bind<ModelValidatorProvider>().To<NinjectDataAnnotationsModelValidatorProvider>(); 

私はそれが最善の解決策ではないと知っているが、それは私が複数のプロバイダが同じバリデータを提供する場合

+0

理由だけではなく、リソースファイルを使用していませんか? –

+0

私が言うように、私は翻訳を得るためにカスタムフレームワークを使用します。 – dpfauwadel

答えて

0

が、それはなぜその原因だと同じルールを複数回登録されます見つけた唯一の一つですエラー。

はこれを試してみてください:

private void RegisterModelProviders() 
{ 
    var provider = new LocalizableDataAnnotationsModelValidatorProvider(); 
    ModelValidatorProviders.Providers.Add(provider); 
    DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false; 
    provider.AddImplicitRequiredValidator = false; 
} 
+0

私は 'provider.AddImplicitRequiredValidator = false;'を持っていないので、これをコンストラクタ 'public LocalizableDataAnnotationsModelValidatorProvider()に入れてみます:base() { AddImplicitRequiredAttributeForValueTypes = false; } 'これは機能しません。 – dpfauwadel

関連する問題