4. 数据注解验证与自动 400 响应

数据注解验证与自动 400 响应 学习卡片

数据注解验证与自动 400 响应

ASP.NET Core 在模型绑定完成后会自动执行数据注解验证。只要模型属性上标注了 [Required]、[StringLength]、[Range] 等特性,且控制器标注了 [ApiController],非法请求会在进入动作方法之前被拦截,并返回 400 Bad Request 与 ProblemDetails 格式的错误体。

下面定义一个用于创建商品的请求模型,并给关键字段加上验证注解:

using System.ComponentModel.DataAnnotations;

public class CreateProductRequest
{
    [Required(ErrorMessage = "商品名称不能为空")]
    [StringLength(50, MinimumLength = 2,
        ErrorMessage = "商品名称长度必须在 2 到 50 个字符之间")]
    public string Name { get; set; } = string.Empty;

    [Range(0.01, 99999.99,
        ErrorMessage = "价格必须在 0.01 到 99999.99 之间")]
    public decimal Price { get; set; }

    [Range(0, 100000,
        ErrorMessage = "库存数量必须在 0 到 100000 之间")]
    public int Stock { get; set; }
}

控制器只需标注 [ApiController],无需手动调用 ModelState.IsValid:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpPost]
    public IActionResult Create(CreateProductRequest request)
    {
        return Ok(new { request.Name, request.Price, request.Stock });
    }
}
[ApiController] 会自动启用模型验证失败时的 400 响应,并生成符合 RFC 7807 的 ProblemDetails 结构。若去掉该特性,则需要在动作方法中手动检查 ModelState。
HTTP POST 请求 /api/products JSON Body 模型绑定 ModelBinder JSON → CreateProductRequest 数据注解验证 [Required] [StringLength] [Range] ModelState 自动填充 ModelState IsValid? 否 自动返回 400 Bad Request ProblemDetails (RFC 7807) 含 errors 字段与验证消息 是 进入动作方法 Create(CreateProductRequest) 返回 200 OK ProblemDetails 响应示例(非法请求) { "type" : "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title" : "One or more validation errors occurred.", "status" : 400, "errors" : { "Name" : ["商品名称不能为空"], "Price" : ["价格必须在 0.01 到 99999.99 之间"] } } 验证规则 Name: 必填, 2~50 Price: 0.01~99999.99

用以下请求体测试非法数据,观察自动 400 响应:

POST /api/products
Content-Type: application/json

{
  "name": "",
  "price": -5,
  "stock": 200000
}

响应状态码为 400,响应体中的 errors 字段会按属性名分组列出所有验证失败消息。若只提交 {"name":"A","price":10,"stock":5},则 Name 长度不足 2,同样触发 400。只有三个字段全部通过验证,请求才会进入 Create 动作方法并返回 200 OK。

关键判断依据:响应头 Content-Type: application/problem+json,响应体包含 status: 400 与 errors 字典;每个键对应模型属性名,值为该属性的验证错误消息数组。