C# .NET Web API如何封装可复用多查询参数结构体或类
.NET Core 3.1 Web API 分页参数冗余问题解决方案
完全可以通过封装公共分页参数类型消除重复代码,.NET Core 3.1 原生支持复杂类型的查询字符串绑定,不需要额外引入第三方组件。
具体实现
- 定义公共分页参数类
直接将通用分页字段封装为独立类,可直接在类上标注[FromQuery]特性,指定该类型默认从请求Query中绑定参数,同时可以在类中配置默认值、参数校验规则,框架会自动执行校验,不需要在每个接口重复写判断逻辑:
using System.ComponentModel.DataAnnotations; using Microsoft.AspNetCore.Mvc; [FromQuery] public class PaginationQuery { /// <summary> /// 页码,默认值1 /// </summary> [Range(1, int.MaxValue, ErrorMessage = "页码必须大于等于1")] public int Page { get; set; } = 1; /// <summary> /// 单页数据量,默认值20,最大限制100 /// </summary> [Range(1, 100, ErrorMessage = "单页数据量需在1-100范围内")] public int PerPage { get; set; } = 20; }
- 接口中直接引用该类型
所有需要分页功能的GET接口,直接将该类型作为入参即可,不需要重复声明两个int类型的分页参数,也不需要重复加[FromQuery]特性,框架会自动把请求URL中?page=xxx&perPage=xxx的查询值绑定到对应属性:
[ApiController] [Route("api/[controller]")] public class GoodsController : ControllerBase { private readonly IGoodsService _goodsService; public GoodsController(IGoodsService goodsService) { _goodsService = goodsService; } // 分页获取商品列表 [HttpGet] public async Task<IActionResult> GetList(PaginationQuery pagination) { // 直接通过pagination.Page、pagination.PerPage获取分页参数 var list = await _goodsService.GetPagedListAsync(pagination.Page, pagination.PerPage); return Ok(new { pagination.Page, pagination.PerPage, Total = list.TotalCount, Items = list.Items }); } }
该绑定方式和你之前单独声明[FromQuery] int page, [FromQuery] int perPage的效果完全一致,前端不需要修改任何传参逻辑,原有请求可以无缝兼容。
后续扩展
如果后续需要调整分页逻辑,比如新增排序字段、筛选条件、修改默认值、调整参数校验规则,只需要修改PaginationQuery类即可,所有引用该类的接口会自动同步变更,不需要逐个接口修改参数声明。
如果需要自定义更复杂的绑定逻辑(比如兼容不同命名的参数传值,比如支持前端传pageSize映射到PerPage),可以自定义模型绑定器全局注册,所有分页参数自动生效。
注意:如果项目中POST、PUT等其他类型的接口也需要复用该分页参数结构,不要在类上标注
[FromQuery],只需要在GET接口的入参前单独加[FromQuery]即可,避免影响其他请求类型的参数绑定逻辑。
内容的提问来源于stack exchange,提问作者Noy Bueno
相关产品推荐
相关产品推荐

