发布的操作参数上的 ModelValidation 没有发生

ModelValidation on posted action parameter not happening

为什么 ASP.NET Core 不验证 [FromBody] 属性操作参数?在下面的示例中,SomeClass 类型的参数 value 未得到验证。它甚至没有出现在 ModelState 字典中(仅 id)。 this.ModelState.IsValid 始终是 true,即使名称 属性 设置为长度超过 2 个字母的字符串。

即使 TryValidateModel 也总是 true 无论请求正文包含什么 (JSON)。

Sample Repo here

public class Startup
{
    public IConfigurationRoot Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services
            .AddMvcCore()
            .AddJsonFormatters();
    }

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole();
        loggerFactory.AddDebug();

        app.UseMvc();
    }
}

using Microsoft.AspNetCore.Mvc;
using System;
using System.ComponentModel.DataAnnotations;

namespace WebApplication3.Controllers
{
    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        [HttpPut("{id:int}")]
        public IActionResult Put(
            int id,
            [FromBody]SomeClass value)
        {
            if (this.ModelState.IsValid == false)
                throw new Exception();

            if (this.TryValidateModel(value) == false)
                throw new Exception();

            return this.BadRequest(this.ModelState);
        }
    }

    public class SomeClass
    {
        [StringLength(2)]
        [Required(AllowEmptyStrings = false)]
        [DisplayFormat(ConvertEmptyStringToNull = false)]
        public string Name { get; set; }
    }
}

您需要注册 MVC 数据注释。当您使用 light AddMvcCore 方法而不是 AddMvc 时,默认情况下不会添加它。修改您的 ConfigureServices 方法:

services
   .AddMvcCore()
   .AddJsonFormatters()
   .AddDataAnnotations(); // add this line