使用FluentValidation时,ModelState.IsValid始终评估为true

时间:2017-10-15 17:37:36

标签: c# fluentvalidation

我是一名初级程序员,试图编写一些简单的代码来测试FluentValidation,但是没有手动调用验证器并将结果添加到带有.AddToModelState的模型状态,我无法让ModelState.IsValid识别出有验证中的错误。我错过了某处的集成吗?

这是我的价值模型,只是一个包含两个预设值的字符串数组。

using FluentValidation.Attributes;
using Playground2.Validators;

namespace Playground2.Models
{
    [Validator(typeof(ValueValidator))]
    public class Value
    {
        public string[] values = { "value1", "" };
    }

}

这是我的验证器,寻找5到10个字符之间的两个值。

using FluentValidation;
using Playground2.Models;

namespace Playground2.Validators
{
    public class ValueValidator : AbstractValidator<Value>
    {
        public ValueValidator()
        {
            RuleFor(x => x.values[0]).Length(5, 10);
            RuleFor(x => x.values[1]).Length(5, 10);
        }
    }
}

在ValuesController中,我只是创建一个值对象并运行检查以查看它是否在输出之前通过了验证。

using FluentValidation.AspNetCore;
using Microsoft.AspNetCore.Mvc;
using Playground2.Models;
using System.Collections.Generic;

namespace Playground2.Controllers
{
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        // GET api/values
        [HttpGet]
        public IEnumerable<string> Get()
        {
            var value = new Value();

            if (!ModelState.IsValid)
            {
                return new string[] { "Not valid" };      
            }
            else
            {
                return value.values;
            }         
    }

但是当运行时,ModelState.IsValid总是评估为true,尽管输入值的信息默​​认是无效的。

1 个答案:

答案 0 :(得分:0)

FluentValidation遵循MVC / HTML关于GETPOST s的约定。在这种情况下,由于用户未必执行任何操作,因此不期望对页面的初始GET进行任何验证。他们反而要求页面开始做某事 - 他们还没有提供数据。

用户填写信息后,惯例是使用<form><button>以HTML <input type="submit"/>提交数据,通过HttpPost将数据提交给控制器标记方法。此时验证已触发,您将能够正确询问ModelState.IsValid