如何在 ASP.NET Core 中使用模型验证来验证所需的查询字符串字段

Ber*_*ken 7 c# asp.net-core asp.net-core-webapi

给出以下 API

public class PagedRequest
{
  [Required, Range(1, 100, ErrorMessage = "Limit must be from 1 to 100.")]
  public int Top { get; set; }

  [Required, Range(0, int.MaxValue, ErrorMessage = "Skip must be 0 or greater.")]
  public int Skip { get; set; }
}

[Route("test")]
[HttpGet]
public ActionResult<BarResponse> GetFoos([FromQuery] PagedRequest request)
{
  if (!ModelState.IsValid) return BadRequest(ModelState);

  // Return 200 OK with data here
}
Run Code Online (Sandbox Code Playgroud)

按预期工作:

  • 测试?skip=0&top=10 -> 返回 200
  • test?skip=0&top=0 -> 返回带有错误消息的 BadRequest

没有按预期工作

  • test?top=0,返回 200 OK,预计跳过字段的必填字段验证错误。

笔记:

  • 使用 ASP.NET Core 3.0
  • 这曾经在 ASP.NET Framework 4.x 中与 FromUri 一起使用,然后我使用非无参数构造函数,这不再被允许

Kir*_*kin 5

您可以[Required]用以下属性替换[BindRequired]该属性:

如果模型的属性无法发生绑定,则导致模型绑定添加模型状态错误。

public class PagedRequest
{
    [BindRequired, Range(1, 100, ErrorMessage = "Limit must be from 1 to 100.")]
    public int Top { get; set; }

    [BindRequired, Range(0, int.MaxValue, ErrorMessage = "Skip must be 0 or greater.")]
    public int Skip { get; set; }
}
Run Code Online (Sandbox Code Playgroud)