Я пытаюсь получить сложный объект из строки запроса, у объекта есть несколько примитивных типов и 2 массива классов для фильтрации и сортировки, но когда я получаю объект из строки запроса, эти 2 массива пусты.
Я пытался спросить об этом в Chat-GPT, погуглил эту проблему и не нашел ничего, что могло бы мне помочь.
Это мой DTO:
public record GetItemsSortedDto(
int ParentId,
SortingFieldDto[]? SortFields,
Filter[]? Filters,
int Page = 1,
int PageSize = 10,
string OrderColumn = "Number",
bool IsSortedAsc = true)
: IStandardForTypesOfConstructionDto;
public class SortingFieldDto
{
public string Field { get; set; } = "Number";
public object RangeStart { get; set; } = null!;
public object RangeEnd { get; set; } = null!;
}
public class Filter
{
public string Id { get; set; } = "TypeOfConstruction";
[FromQuery(Name = "Value")]
public string[] Values { get; set; } = null!;
}
И вот мой метод контроллера
[HttpGet("ItemsSorted")]
[ProducesResponseType(StatusCodes.Status200OK)]
public async Task<ActionResult> GetItemsSorted([FromQuery] GetItemsSortedDto getDto)
{
var query = _mapper.Map<GetItemsByParentSortedQuery>(getDto);
var result = await Mediator.Send(query);
return Ok(query);
}
Я пытался использовать привязку модели, но безуспешно. В DTO мне нужно хранить массивы сортировки и фильтрации, чтобы я мог сортировать и фильтровать более 1 столбца одновременно.
Обновлять: Вышеупомянутое решение должно помочь для привязки объектов с атрибутом [fromBody], но, к сожалению (та же документация):
«Данные маршрута и значения строки запроса используются только для простых типов».
Таким образом, вы не можете связать сложный объект, используя только строку запроса.
Оригинал: Из документации Microsoft по привязке модели (https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-8.0#complex-types)
«Сложный тип должен иметь общедоступный конструктор по умолчанию и общедоступные записываемые свойства для привязки».
Ваш класс Dto использует новую модель конструктора (что не должно быть проблемой), но у него есть только поля и нет свойств.
Я бы попробовал реорганизовать поля до реальных свойств.
Я добавил этот общедоступный класс GetItemsSortedDto: IStandartForTypesOfConstructionDto {public int ParentId {get; набор; } Общественный SortingFieldDto[]? Сортировочные поля {получить; набор; } [BindRequired] общедоступный фильтр[]? Фильтры {получить; набор; } Общественная страница Int {получить; набор; } = 1; общественный ИНТ PageSize {получить; набор; } = 10; общественная строка OrderColumn {get; набор; } = "Число"; общественный bool IsSortedAsc {получить; набор; } = правда; } вместо записи и ничего не изменилось. Ты хотел это сделать или нет?
Да, но я только что нашел в документации другое: «Данные маршрута и значения строки запроса используются только для простых типов». Итак, то, что вы пытаетесь сделать, к сожалению, невозможно.
Хорошо, но спасибо за помощь
Ничто не мешает вам принимать значения в виде строки, а затем при необходимости анализировать отдельные элементы из этой строки. Это немного сложнее, чем полагаться на привязку модели, но все же вполне выполнимо. Альтернативно – не публикуйте эти данные в строке запроса. Опубликуйте его как часть тела запроса (с JSON).