代码之家  ›  专栏  ›  技术社区  ›  Ritmo2k

将复杂类型的集合与查询字符串中的其他属性绑定

  •  1
  • Ritmo2k  · 技术社区  · 7 年前

    我使用的是asp.net core v2.1,我有一个继承自的控制器 Controller FromQuery 基于以下模型:

    public class PagingControl<T>
    {
        public ColumnSort[] ColumnSorts { get; set; }
    
        public T ColumnFilters { get; set; }
    
        public int Page { get; set; }
    
        public int PerPage { get; set; }
    }
    
    public class ColumnSort
    {
        public string Field { get; set; }
    
        public SortType Type { get; set; }
    }
    
    public enum SortType
    {
        Asc = 0,
        Desc
    }
    

    PagingControl<T> 模型描述了使用操作实现分页所需的所有参数。

    这个 ColumnSorts 属性是一个集合,因为可以进行多个连续列排序。

    我读过 Array or List in query string does not get parsed 然而,如果我理解这一点,我就不能有一个接受所有查询参数的单一模型。

    专栏分类 不是集合,与单列排序一致。

    有人知道这种情况下使用查询字符串的解决方法吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   itminus    7 年前

    您上面描述的问题已经解决。此外,即使它不是固定的,你也可以绕着它走一圈 [FromQuery(Name="xxx")] dougbu's walkaround

    看来你正在使用 [ApiController] 2.1.302 2.1.402 ,它工作完美无瑕。

    MyColoumnFilter ,将用作您的 T ColumnFilters PagingControl<T>

    public class MyColumnFilter
    {
        public string FieldA { get; set; }
        public string FieldB { get; set; }
    }
    

    [Route("api/[controller]")]
    [ApiController]
    public class MyController : Controller
    {
        // GET api/values
        [HttpGet]
        public IActionResult Get([FromQuery]PagingControl<MyColumnFilter> pc)
        { 
            return new JsonResult(pc);
        } 
    
        // ...
    }
    

    如果您发送以下请求:

    GET https://localhost:5001/api/my?page=1&perPage=10&columnFilters.fieldA=1&columnFilters.fieldB=2&columnSorts[0].Field=cs1&columnSorts[0].Type=Asc&columnSorts[1].Field=cs2&columnSorts[1].Type=Desc HTTP/1.1
    

    enter image description here

    查询字符串可分为4个部分:

    1. int 一的
    2. 佩奇:一个 int
    3. 列过滤器: columnFilters.fieldA=1&columnFilters.fieldB=2
    4. columnSorts[]:自 ColumnSorts 是一个数组,我们应该像 columnSorts[0].Field=xx&columnSorts[0].Type=Asc&columnSorts[1].Field=...

    另外,如果使用 GET http方法。看见 Chris Pratt's comment 根据我的另一个回答。

    推荐文章