Asp.net mvc FluentValidation:自定义验证程序工厂和客户端验证

Asp.net mvc FluentValidation:自定义验证程序工厂和客户端验证,asp.net-mvc,structuremap,fluentvalidation,Asp.net Mvc,Structuremap,Fluentvalidation,我有自己的验证器工厂,在asp net mvc 3应用程序中实现structuremap public class StructureMapValidatorFactory : ValidatorFactoryBase { public override IValidator CreateInstance(Type validatorType) { return ObjectFactory.TryGetInstance(validatorType) as IVal

我有自己的验证器工厂,在asp net mvc 3应用程序中实现structuremap

public class StructureMapValidatorFactory : ValidatorFactoryBase
{
    public override IValidator CreateInstance(Type validatorType)
    {
        return ObjectFactory.TryGetInstance(validatorType) as IValidator;
    }
}
在全球asax中

FluentValidationModelValidatorProvider.Configure(provider => 
{ 
  provider.ValidatorFactory = new StructureMapValidatorFactory(); 
});
好的,使用这种组合,客户端验证不起作用,如果我使用标准的提供者配置,客户端验证就可以正常工作


这里有什么解决方法吗?

请确保已正确配置DI框架以解析验证器。如果
ObjectFactory.TryGetInstance(validatorType)
返回null,它将不起作用,因为没有任何与模型关联的验证器,也不会发出元数据。

最后,忘了在我的boostrap中调用Configure方法。所以

ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new StructureMapValidatorFactory()));
然后

FluentValidationModelValidatorProvider.Configure();

嗯,是的,在我的引导中,我在结构映射中显式注册了每个fluent验证器,但是客户端验证仍然不起作用。您是否在Configure方法中调试了代码?您是否确保
ObjectFactory.TryGetInstance(validatorType)
不返回null?我猜您没有,因为IMHO这就是代码不工作的原因=>没有为给定类型返回验证程序。不要使用StructureMap,首先尝试对相应的验证器进行硬编码:
provider.ValidatorFactory=new MyViewModelValidator()
.Hmm,你说得对,var instance=ObjectFactory.TryGetInstance(validatorType),因为如果我手动设置validator([validator(typeof(validation_class))]),则validator返回nullBtw。客户端验证工作正常。但是我想在我的验证器类中使用DI,那么如何正确配置我的结构映射容器呢?你不应该在自定义的验证器工厂中使用
[validator(typeof(validation_class))]
。至于配置StructureMap,这是另一个主题=>您可以开始一个新问题。请阅读以下内容: