4. 数据注解验证与自动 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。
用以下请求体测试非法数据,观察自动 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 字典;每个键对应模型属性名,值为该属性的验证错误消息数组。