我正在使用 asp.net core v2.1,我有一个继承自 Controller
的 Controller 包含一个带有 FromQuery
装饰参数的 Action 基于以下模型:
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
}
通用参数表示具有可空属性的平面 poco,这些属性提供明确定义的列和值以供过滤。 PagingControl<T>
模型描述了用 Action 实现分页所需的所有参数。
ColumnSorts
属性是一个集合,因为可以对多个连续的列进行排序。
我已阅读 Array or List in query string does not get parsed但是,如果我理解这一点,我就无法拥有接受所有查询参数的单一模型。
为了成功实现分页的全部功能,所有参数都是必需的。这在 ColumnSorts
时工作正常不是集合,符合单列排序。
有人知道针对这种情况使用查询字符串的解决方法吗?
最佳答案
您上面描述的问题已经得到解决。此外,即使它不固定,您也可以通过 [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
它将按预期工作:
querystring可以分为4个部分:
- 页面:
int
共 1 - 每页:
int
共 10 - 列过滤器:
columnFilters.fieldA=1&columnFilters.fieldB=2
- columnSorts[] : 自
ColumnSorts
是一个数组,我们应该构造像columnSorts[0].Field=xx&columnSorts[0].Type=Asc&columnSorts[1].Field=...
这样的参数
作为旁注,如果您使用 GET
会使查询字符串变得相当复杂http 方法。参见 Chris Pratt's comment在我的另一个答案下。
关于c# - 将复杂类型的集合与查询字符串中的其他属性绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53227568/