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] はインターフェイスであり、構築できません。タイプマッピングがありませんか?