【问题标题】:Fluent Validation Duplicate Errors in ModelState["Prop"]).ErrorsModelState["Prop"]).Errors 中的 Fluent Validation 重复错误
【发布时间】:2016-11-20 12:15:48
【问题描述】:

当我检查我的ModelState["Email"].Errors 时,我发现相同的验证错误重复了 3 次,而我的所有模型恰好重复了 3 次,我的模型包含超过 3 个属性。

我想知道为什么规则要执行三遍。 我正在使用带有 AutofacMVC 5。我找不到错误! 没有错误,但是如果每个属性都经过 3 次验证,我会担心性能,有些验证很复杂,有时会连接到数据库。 下面是我用来注册ValidatorsFluent ValidationAutofac的代码。

builder.RegisterAssemblyTypes(System.Reflection.Assembly.Load("MyAssembly"))
    .Where(t => t.Name.EndsWith("Validator"))
    .AsImplementedInterfaces()
    .InstancePerRequest();

builder.RegisterType<FluentValidationModelValidatorProvider>().As<ModelValidatorProvider>();
builder.RegisterType<AutofacValidatorFactory>().As<IValidatorFactory>().SingleInstance();

Container = builder.Build();// Build !

// FluentValidation wire up to MVC
var fluentValidationModelValidatorProvider = new fluentValidationModelValidatorProvider()
{
    AddImplicitRequiredValidator = false,
    ValidatorFactory = new AutofacValidatorFactory()
};

//fluentValidationModelValidatorProvider.AddImplicitRequiredValidator = false;

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
ModelValidatorProviders.Providers.Add(fluentValidationModelValidatorProvider);

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(Container);

模型如下所示:

public class ContactInfoDTO
{
    public int ID { get; set; }
    public string Email { get; set; }
    public string Email2 { get; set; }
    public string PhoneNumber { get; set; }
    public string PhoneNumber2 { get; set; }
    public string EmergencyNumber { get; set; }
    public string EmergencyPersonName { get; set; }

    public ContactInfoDTO()
    {
    }
}

【问题讨论】:

  • 你也可以发布你的模型吗?
  • 你在哪里定义你的流利验证?
  • “定义流畅的验证”是什么意思?如果您的意思是第一个代码块,它会在 Global.asax 的 Application_Start() 中执行一次

标签: c# asp.net-mvc validation autofac fluentvalidation


【解决方案1】:

这就是你应该如何使用 Fluent 验证:

using FluentValidation;

public class CustomerValidator: AbstractValidator<Customer> {
  public CustomerValidator() {
    RuleFor(customer => customer.Surname).NotEmpty();
    RuleFor(customer => customer.Forename).NotEmpty().WithMessage("Please specify a first name");
    RuleFor(customer => customer.Discount).NotEqual(0).When(customer => customer.HasDiscount);
    RuleFor(customer => customer.Address).Length(20, 250);
    RuleFor(customer => customer.Postcode).Must(BeAValidPostcode).WithMessage("Please specify a valid postcode");
  }

  private bool BeAValidPostcode(string postcode) {
    // custom postcode validating logic goes here
  }
}

Customer customer = new Customer();
CustomerValidator validator = new CustomerValidator();
ValidationResult results = validator.Validate(customer);

bool validationSucceeded = results.IsValid;
IList<ValidationFailure> failures = results.Errors;

你应该为你的模型创建一个验证器,这样你就可以控制在你验证你的对象时会发生什么。

【讨论】:

  • 我已经有一个类似的类,每个属性都有一个 RuleFor,这没有问题。我只是不想粘贴它,因为它很蓬松。你验证模型的那几行现在由 MVC 管道完成,当 MVC 需要它们时,它利用 autofac 注入验证器。问题出在这部分,MVC 似乎执行了 3 次相同的规则!
【解决方案2】:

感谢大家的支持。 感谢 FluentValidation 的所有者 Jeremy Skinner 先生对其进行了调查,下面是解决方案的链接。 毕竟是我的错 :)

https://github.com/JeremySkinner/FluentValidation/issues/362

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 2014-09-24
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多