スタティックコードではなくデータストアから検証属性を設定できるカスタムプロバイダをセットアップしました。私の.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に投稿されたときに発生されません。
申し訳ありません私はあなたの質問だったことを認識していない他の質問にコメントを投稿しました!私が知っていることから、APIコントローラと標準コントローラは別々のモデルバインダを使用しているため、問題は正しいモデルバインダにバリデータを正しく追加していないことが原因です。現在のところ私のPCではありませんが、後でそれを見ていきます:) – Henry
@HenryGarleはい、これをテストしたばかりですが、カスタム検証はControllerにはポストされても、ApiControllerにはポストされません。 ApiControllerに対して正しく登録する方法がわかりません。 – Dave
これは良いスタートですが、代わりにModelValidatorProviderを継承しますか? – Henry