1

MVC 3.0 で FluentValidation を使用しています。カスタムバリデーターファクトリーと IoC コンテナー (Unity) で動作するように構成しました。

すべてが正常に機能し、カスタム検証を実行して依存関係を挿入することができます...しかし、奇妙なことが起こりました.HtmlHelperがコントロールを作成したすべての強く型付けされたビュー(例:Html.Editor)で、 MVC はバリデーターをインスタンス化しようとしていますが、これらのモデルに対して Unity にマップされたバリデーターがないため、Unity エラーが発生します...これらのビューでは、モデルが有効かどうかを確認するチェックがなく、自動モデルバインディングがあるので、どうすればこれを防ぐことができますか? これらのエラーを取り除くためだけに、モデルごとに空のバリデーターを作成して Unity に登録する必要はありません。

global.asax にファクトリを登録する方法は次のとおりです。

FluentValidationModelValidatorProvider.Configure(provider =>
{
    provider.ValidatorFactory = new UnityValidatorFactory(container);
});
DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;

そして、これが私のカスタムバリデータを登録する方法です:

container.RegisterType<IValidator<XViewModel>, XViewModel>(
    new ContainerControlledLifetimeManager(),
    new InjectionConstructor(container.Resolve<ILocalizationService>(),
    container.Resolve<ISessionService>()));

XView の場合、すべて問題ありません。アクション メソッドで TryUpdateModel を実行すると、検証が正常に機能します。ただし、検証を行いたくない他のビューの場合、MVC は引き続きそれらのバリデーターを解決しようとしますが、Unity に何も登録されていないため、通常は失敗します。

これを修正する方法について何か考えはありますか?

ありがとうございました、

ジョージ

編集: 他のビューのエラーは次のとおりです: 現在のタイプ IValidator`1[...ViewModel] はインターフェイスであり、構築できません。タイプマッピングがありませんか?

4

1 に答える 1

0

タイプを解決できなかったときにnullを返すようにUnityValidatorFactoryを変更しました。この回避策がパフォーマンスの観点からどれほど優れているかはわかりませんが(例外が発生するため)、今のところ、より良い解決策はありません...

于 2012-07-12T07:42:23.327 に答える