我在MVC 3.0中使用FluentValidation;我已将其配置为使用自定义验证器工厂和IoC容器(Unity);
一切正常,我可以进行自定义验证,并使用我的依赖项注入它们...但是发生了一件奇怪的事情:在所有强类型视图中,我有HtmlHelper创建的控件(例如:Html.Editor),似乎MVC正在尝试实例化一个验证器,这会导致Unity错误,因为在Unity中没有为这些模型映射的Validator ......在那些视图中我没有任何检查来查看Model是否有效,并且没有任何自动模型绑定,所以我怎么能阻止这种情况发生?我不想为每个模型创建空验证器,并在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]是一个接口,无法构造。你错过了类型映射吗?
答案 0 :(得分:0)
当我无法解析类型时,我修改了UnityValidatorFactory以返回null;我不知道这种解决方法从性能的角度来看有多好(因为引发了异常),但目前我还没有更好的解决方案......