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

ModelState.IsValid always evaluating as true when working with 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,尽管输入值的信息在默认情况下是无效的。

FluentValidation 遵循 MVC's/HTML 关于 GETs 和 POSTs 的约定。在这种情况下,它不期望对页面的初始 GET 进行任何验证,因为用户不一定会执行任何操作。相反,他们请求页面 start 做某事 - 他们还没有时间提供数据。

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