【问题标题】:DataAnnotations and FluentValidation not working in MVC 2 projectDataAnnotations 和 FluentValidation 在 MVC 2 项目中不起作用
【发布时间】:2010-10-04 12:07:23
【问题描述】:

我已经编辑了原始问题,因为发生了相同的错误,不同之处在于实现,我现在已将 Ninject 添加到组合中。

我为验证规则创建了一个类

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

我为 Ninject 创建了一个 ValidatorModule

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

这是我的验证器工厂

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;
    }
}

以及来自我的 Global 的相关部分

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()); }
    }

我加载示例站点,单击创建新专辑链接,然后单击创建按钮,将标题留空,然后我收到错误保护覆盖 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 Bootstrapper(),
            new FluentValidatorModule()); }
    }

我加载创建表单并单击创建,将标题留空并看到一个错误

This property cannot be set to a null value.

它引用的行在实体框架自动生成的类中,我跟踪了

Namespace.Contains("DynamicProxies")

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

还是我错过了什么?

干杯。

【问题讨论】:

  • 当你说它不起作用时,你的意思是验证没有发生,还是整个 Action 不起作用?

标签: asp.net-mvc-2 data-annotations fluentvalidation


【解决方案1】:

问题在于 Entity Framework 正在为您的类生成动态代理,然后您的系统试图针对代理类而不是您定义的类进行验证。

解决方法和这个answer一样。

【讨论】:

  • 没有解决问题,但似乎让我更进一步。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2018-10-02
  • 1970-01-01
相关资源
最近更新 更多