5

スタティックコードではなくデータストアから検証属性を設定できるカスタムプロバイダをセットアップしました。私の.NET MVC 4プロジェクトのクライアント側の検証でうまく動作しますが、サーバー側の検証が機能しなくなりました。カスタムDataAnnotationsModelValidatorProviderを使用したサーバー側の検証

CustomModelValidatorProviderの.csファイル:私は私のGlobal.asax.csで

 

    public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider 
    { 
     protected override IEnumerable GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable attributes) 
     { 
      // set attributes from datastore here 

      return base.GetValidators(metadata, context, attributes); 
     } 
    } 

 

    protected void Application_Start() 
    { 
     ModelValidatorProviders.Providers.Clear(); 
     ModelValidatorProviders.Providers.Add(new CustomModelValidatorProvider()); 
    } 

そして、私が持っているウェブAPIメソッドで:

ここ
 

    var validationResultList = new List(); 
    bool valid = Validator.TryValidateObject(myModelObject, new ValidationContext(myModelObject, null, null), validationResultList, true); 

、 validは常にtrueです。 Jqueryのクライアント側の検証でエラーが表示された場合でもサーバー側では、私のカスタムプロバイダはデータ注釈を適用するために使用されていません。 GetValidators()にブレークポイントを設定すると、ビューが作成され、クライアント側のバリデータが正しく表示されたときに呼び出されますが、モデルがコントローラにバインドされているときに再び呼び出されることはありません。

ステップがありませんでしたか?どんな助けでも大歓迎です!

UPDATE

カスタムバリデータは、オブジェクトがコントローラに掲載されている場合に正しく動作しますが、ApiControllerに投稿されたときに発生されません。

+0

申し訳ありません私はあなたの質問だったことを認識していない他の質問にコメントを投稿しました!私が知っていることから、APIコントローラと標準コントローラは別々のモデルバインダを使用しているため、問題は正しいモデルバインダにバリデータを正しく追加していないことが原因です。現在のところ私のPCではありませんが、後でそれを見ていきます:) – Henry

+0

@HenryGarleはい、これをテストしたばかりですが、カスタム検証はControllerにはポストされても、ApiControllerにはポストされません。 ApiControllerに対して正しく登録する方法がわかりません。 – Dave

+0

これは良いスタートですが、代わりにModelValidatorProviderを継承しますか? – Henry

答えて

3

私はついにこれを理解しました。それはかなり簡単な答えです。 ApiControllersは、System.Web.Http.Validation名前空間のプロバイダーにのみ応答し、通常のコントローラーおよびクライアント側の検証に使用されるSystem.Web.Mvc名前空間には応答しません。

両方を実装して、クライアント側の検証とサーバー検証の両方をApiControllerで実現しました。

関連する問題