Fluent Validation验证程序会在甚至添加验证代码之前导致错误

时间:2018-10-05 16:40:37

标签: c# fluentvalidation

我正在使用Contoso University项目尝试Fluent验证。

因此,我已将验证器属性添加到现有类:

[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()
    {
    }
}

但是当我访问学生的创建页面时,我的调试器会在EditorFor行上停止。...

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

...。我得到一个错误:

  

不打扰的客户端验证规则中的验证类型名称必须为   独特。多次看到以下验证类型:   必填

我似乎没有多次对同一元素进行相同的验证,所以为什么会出现错误? 流利的验证可以与MVC的内置验证一起使用吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

  

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

     

如果要禁用此行为,以使FluentValidation为   只有执行的验证库,您可以设置   在您的RunDefaultMvcValidationAfterFluentValidation执行为false   应用程序启动例程:

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

注意如果您设置   RunDefaultMvcValidationAfterFluentValidation执行为false然后   对IValidatableObject的支持也将被禁用。

希望这会有所帮助!

答案 2 :(得分:0)

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

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

我不想更改任何现有数据注释的行为,所以我只添加了