【问题标题】:Fluent Validation validator results in an error before validation code is even added to itFluent Validation 验证器在验证代码添加到它之前会导致错误
【发布时间】:2018-10-26 23:38:52
【问题描述】:

我正在使用 Contoso 大学项目尝试 Fluent Validation。

所以我在现有类中添加了一个验证器属性:

[Validator(typeof(PersonValidator))]
public abstract class Person
{
    public int ID { get; set; }

    [Required]
    [StringLength(50)]
    [Display(Name = "Last Name")]
    public string LastName { get; set; }
}

我的PersonValidator 还没有做任何事情:

public class PersonValidator : AbstractValidator<Person>
{
    public PersonValidator()
    {
    }
}

但是当我访问 Student 的创建页面时,我的调试器在 EditorFor 行停止......

 @Html.EditorFor(model => model.LastName, 
      new { htmlAttributes = new { @class = "form-control" } })

….我得到一个错误:

不显眼的客户端验证规则中的验证类型名称必须是 独特的。不止一次看到以下验证类型: 必填

我似乎没有多次对同一个元素进行相同的验证,那么为什么我会收到错误消息? Fluent Validation 可以与 MVC 的内置验证一起使用吗?

【问题讨论】:

标签: c# fluentvalidation


【解决方案1】:

如果您将 FluentValidation 与 DataAnnotations 一起使用,则可能会发生这种情况。尝试在 Application_Start 中做这样的事情

DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
FluentValidationModelValidatorProvider.Configure(provider => provider.AddImplicitRequiredValidator = false);
var fluentValidationModelValidatorProvider = new FluentValidationModelValidatorProvider(new AttributedValidatorFactory());
ModelValidatorProviders.Providers.Add(fluentValidationModelValidatorProvider);

【讨论】:

  • 我怀疑我遇到了同样的错误,因为我添加了此代码以及标准 FluentValidationModelValidatorProvider.Configure() 而不是代替它。呵呵!
【解决方案2】:

根据this 页面,您可以尝试删除 DataAnnotations 验证。

与 ASP.NET 内置 Validation 的兼容性 默认情况下,在 FluentValidation 执行后,任何其他验证器提供程序都会 也有机会执行。这意味着你可以混合 具有 DataAnnotations 属性的 FluentValidation(或任何其他 ASP.NET ModelValidatorProvider 实现)。

如果您想禁用此行为,以便 FluentValidation 是 只有执行的验证库,您可以设置 RunDefaultMvcValidationAfterFluentValidationExecutes 在你的 应用程序启动例程:

services.AddMvc().AddFluentValidation(fv => {
 fv.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
});

注意如果你设置 RunDefaultMvcValidationAfterFluentValidationExecutes 为 false 然后 对 IValidatableObject 的支持也将被禁用。

希望这会有所帮助!

【讨论】:

  • 这表示您可以将 FluentValidation 与 DataAnnotations 属性混合使用。我的经验告诉你不能。
【解决方案3】:

我不确定为什么它会向字符串字段添加隐式必需验证器,但是当我将 Fluent Validation Provider 配置为不在我的 Global.asax.cs 文件中添加隐式必需验证器时,问题就消失了:

FluentValidationModelValidatorProvider.Configure(provider 
    => provider.AddImplicitRequiredValidator = false);

我不想更改任何现有数据注释的行为,所以这就是我添加的全部内容

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多