5

静的コードではなくデータ ストアから検証属性を設定できるように、カスタム プロバイダーをセットアップしました。私の .NET MVC 4 プロジェクトのクライアント側の検証ではうまく機能しますが、サーバー側の検証を機能させることができません。

CustomModelValidatorProvider.cs:

    public class CustomModelValidatorProvider : DataAnnotationsModelValidatorProvider
    {
        protected override IEnumerable GetValidators (ModelMetadata メタデータ、ControllerContext コンテキスト、IEnumerable 属性)
        {
            // ここでデータストアから属性を設定します

            base.GetValidators(メタデータ、コンテキスト、属性) を返します。
        }
    }

私の Global.asax.cs には次のものがあります。

    保護された void Application_Start()
    {
        ModelValidatorProviders.Providers.Clear();
        ModelValidatorProviders.Providers.Add(新しい CustomModelValidatorProvider());
    }

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

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

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

私は一歩を踏み外しましたか?どんな助けでも大歓迎です!

アップデート

カスタム バリデータは、オブジェクトがコントローラーにポストされると正しく機能しますが、ApiController にポストされると起動しません。

4

1 に答える 1

3

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

ApiControllersでクライアント側の検証とサーバーの検証の両方を実現するために両方を実装しました。

于 2012-08-31T01:27:17.833 に答える