繁体   English   中英

流畅的验证与ASP.NET MVC 5不一致

[英]Fluent Validation Inconsistent with ASP.NET MVC 5

我正在使用Fluent Validation v5.5和ASP.NET v5.2.2,并且我在验证时遇到了一些不一致的结果。

我的观点模型是:

public class QuoteViewModel
{
    [Display(Name = @"Day")]
    public int DateOfBirthDay { get; set; }

    [Display(Name = @"Month")]
    public int DateOfBirthMonth { get; set; }

    [Display(Name = @"Year")]
    public int DateOfBirthYear { get; set; }

    [Display(Name = @"Gender")]
    public Gender? Gender { get; set; }

    [Display(Name = @"State")]
    public int StateId { get; set; }
}

我的控制器方法是:

public ActionResult Quote(QuoteViewModel viewModel)
{
    var _validator = new QuoteValidator();
    var results = _validator.Validate(viewModel);

    if (!ModelState.IsValid)
    {
        return Json(false);
    }

    return Json(true);
}

我的验证器是:

public class QuoteValidator : AbstractValidator<QuoteViewModel>
{
    public QuoteValidator()
    {
        RuleFor(x => x.Gender).NotEmpty();
        RuleFor(x => x.StateId).NotEmpty();
        RuleFor(x => x.DateOfBirthDay).NotEmpty().InclusiveBetween(1, 31);
        RuleFor(x => x.DateOfBirthMonth).NotEmpty().InclusiveBetween(1, 12);
        RuleFor(x => x.DateOfBirthYear).NotEmpty().LessThanOrEqualTo(DateTime.UtcNow.Year);
    }
}

我正在运行一个测试,发布所有空白值表单字段。 因此,视图模型字段在创建视图模型对象后保留默认值。

为了比较,在控制器中我明确地运行验证,结果与ModelState中的验证结果不一致。

ModelState显示4个错误,全部由NotEmpty规则触发。 可空的枚举上的NotEmpty性别似乎没有触发。

显式验证返回8个错误中的7个,因为DateOfBirthYear默认为零,所以LessThanOrEqualTo规则不会触发。

我的痛点是我无法弄清楚为什么ModelState在可空的enum Gender上缺少NotEmpty错误。

我能够触发该错误的唯一方法是仅发布Gender值。

请帮忙。

编辑:

单步执行某些代码后,问题似乎与Fluent验证RequiredFluentValidationPropertyValidator有关。 Gender字段是一个可为空的值类型,它绑定为null。 RequiredFluentValidationPropertyValidator的以下片段阻止验证:

ShouldValidate = isNonNullableValueType && nullWasSpecified;

!ModelState.IsValid不使用您的验证结果,它使用defaulf MVC验证(可以通过DataAnnotations添加)。 你必须检查!results.IsValid ,它包含你的QuoteValidator的验证结果。

如果要使用默认的ModelState.IsValid ,则必须使用validator属性标记模型:

[Validator(typeof(QuoteValidator))]
public class QuoteViewModel
{
    [Display(Name = @"Day")]
    public int DateOfBirthDay { get; set; }

    [Display(Name = @"Month")]
    public int DateOfBirthMonth { get; set; }

    [Display(Name = @"Year")]
    public int DateOfBirthYear { get; set; }

    [Display(Name = @"Gender")]
    public Gender? Gender { get; set; }

    [Display(Name = @"State")]
    public int StateId { get; set; }
}

并将以下行添加到Application_Start方法:

protected void Application_Start() {
    FluentValidationModelValidatorProvider.Configure();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM