c# - 将复杂类型的集合与查询字符串中的其他属性绑定(bind)

标签 c# asp.net-core

我正在使用 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 ColumnFiltersPagingControl<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

querystring可以分为4个部分:

  1. 页面:int共 1
  2. 每页:int共 10
  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在我的另一个答案下。

关于c# - 将复杂类型的集合与查询字符串中的其他属性绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53227568/

相关文章:

asp.net-core - Azure Devops Oauth 身份验证 : Cannot get access token (BadRequest Failed to deserialize the JsonWebToken object)

c# - 在 Debian 8.10 上启动 ASP.NET Core React Web 应用程序时出错

c# - 当我尝试将枚举格式化为字符串时,为什么我的格式会出错?

javascript - 从数据表创建复杂的 json C#

c# - 以编程方式在 WPF ControlTemplate 中创建 Storyboard

security - 如何获取 Asp.Net Core 加密 key 的访问权限?

C# 作为用户界面调用 Prolog 作为推理模块

c# - C#中的嵌套命名空间

asp.net-core - "k ef"在 Visual Studio 2015 程序包管理器控制台中抛出异常

c# - 如何在 Ubuntu 上托管 Microsoft 机器人?