Связывание коллекции сложного типа с другими свойствами из строки запроса - PullRequest
0 голосов
/ 09 ноября 2018

Я использую ядро ​​asp.net 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
}

Общий параметр представляет собой плоское poco со значениями Nullable, которые предоставляют хорошо определенные столбцы и значения для фильтрации. Модель PagingControl<T> описывает все параметры, необходимые для реализации подкачки с действием.

Свойство ColumnSorts является коллекцией, так как возможна множественная последовательная сортировка столбцов.

Я прочитал Массив или Список в строке запроса не анализируются Однако, если я понимаю, у меня не может быть единой модели, которая принимает все параметры запроса.

Для успешной реализации полной функциональности подкачки требуются все параметры. Это работало нормально, когда ColumnSorts не был коллекцией, что соответствует сортировке по одному столбцу.

Кто-нибудь знает обходной путь со строкой запроса для этого сценария?

1 Ответ

0 голосов
/ 12 ноября 2018

Проблема, описанная выше, уже исправлена. Кроме того, даже если он не исправлен, вы можете обойти его по [FromQuery(Name="xxx")]. См. обход Дугбу .

Кажется, вы используете [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 из 1
  2. perPage: int из 10
  3. columnFilters: columnFilters.fieldA=1&columnFilters.fieldB=2
  4. columnSorts []: поскольку ColumnSorts является массивом, мы должны создать параметр, подобный columnSorts[0].Field=xx&columnSorts[0].Type=Asc&columnSorts[1].Field=...

В качестве дополнительного примечания, это усложнит строку запроса, если вы используете метод GET http. См. комментарий Криса Пратта под моим другим ответом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...