2010-10-04 65 views
0

工作,我已经修改了原来的问题,因为同样的错误发生的区别在于执行,我现在已经添加Ninject的组合。DataAnnotations和FluentValidation不MVC 2项目

我创建了一个类

public class AlbumValidator : AbstractValidator<Album> { 
    public AlbumValidator() { 
     RuleFor(a => a.Title).NotEmpty(); 
    } 
} 

我创建了一个ValidatorModule为Ninject

internal class FluentValidatorModule : NinjectModule { 
    public override void Load() { 
     AssemblyScanner.FindValidatorsInAssemblyContaining<AlbumValidator>() 
      .ForEach(result => Bind(result.InterfaceType).To(result.ValidatorType).InSingletonScope()); 
    } 
} 

这里的验证规则是我ValidatorFactory

public class NinjectValidatorFactory : ValidatorFactoryBase { 
    public override IValidator CreateInstance(Type validatorType) { 
     if (validatorType.GetGenericArguments()[0].Namespace.Contains("DynamicProxies")) { 
      validatorType = Type.GetType(string.Format("{0}.{1}[[{2}]], {3}", 
       validatorType.Namespace, 
       validatorType.Name, 
       validatorType.GetGenericArguments()[0].BaseType.AssemblyQualifiedName, 
       validatorType.Assembly.FullName)); 
     } 

     return Container.Get(validatorType) as IValidator; 
    } 

    IKernel Container { get; set; } 
    public NinjectValidatorFactory(IKernel container) { 
     Container = container; 
    } 
} 

,并从相关部分我的全球

protected override void OnApplicationStarted() { 
     AreaRegistration.RegisterAllAreas(); 
     RegisterRoutes(RouteTable.Routes); 

     var factory = new NinjectValidatorFactory(Container); 

     ModelValidatorProviders.Providers.Add(
      new FluentValidationModelValidatorProvider(factory)); 

     DataAnnotationsModelValidatorProvider 
      .AddImplicitRequiredAttributeForValueTypes = false; 
    } 

    protected override IKernel CreateKernel() { 
     return Container; 
    } 

    IKernel Container { 
     get { return new StandardKernel(new FluentValidatorModule()); } 
    } 

我加载创建新的相册链接的样本网站点击,然后点击创建按钮离开标题空白,我再与()OnApplicationStarted错误保护覆盖无效{ AreaRegistration.RegisterAllAreas()映入眼帘; RegisterRoutes(RouteTable.Routes);

 var factory = new NinjectValidatorFactory(Container); 

     ModelValidatorProviders.Providers.Add(
      new FluentValidationModelValidatorProvider(factory)); 

     DataAnnotationsModelValidatorProvider 
      .AddImplicitRequiredAttributeForValueTypes = false; 
    } 

    protected override IKernel CreateKernel() { 
     return Container; 
    } 

    IKernel Container { 
     get { return new StandardKernel(
      new Bootstrapper(), 
      new FluentValidatorModule()); } 
    } 

我加载了创建表格,然后点击创建离开标题空低,看哪一个错误

This property cannot be set to a null value. 

它引用该生产线是实体框架自动生成的类中,我跟踪

Namespace.Contains("DynamicProxies") 

它返回false,这是因为我告诉EF使用自定义命名空间SampleMusicStore.Web?

还是我缺少别的东西?

干杯。

+0

当你说它不工作,你的意思是验证没有发生,或者整个行动不起作用? – codeulike 2010-10-04 12:17:52

回答

1

的问题是,实体框架是产生在你的类动态代理,然后你的系统试图验证对代理类,而不是你定义的类。

解决这一问题的方法是一样的,因为这answer

+0

没有解决问题,但似乎让我更进一步。 – 2010-10-07 07:46:22