Есть ли способ получить сложный объект из строки запроса в ASP.NET Core 8?

Я пытаюсь получить сложный объект из строки запроса, у объекта есть несколько примитивных типов и 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 столбца одновременно.

Ничто не мешает вам принимать значения в виде строки, а затем при необходимости анализировать отдельные элементы из этой строки. Это немного сложнее, чем полагаться на привязку модели, но все же вполне выполнимо. Альтернативно – не публикуйте эти данные в строке запроса. Опубликуйте его как часть тела запроса (с JSON).

mason 06.08.2024 15:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 {получить; набор; } = правда; } вместо записи и ничего не изменилось. Ты хотел это сделать или нет?

Maxim Rudolovskii 06.08.2024 14:12

Да, но я только что нашел в документации другое: «Данные маршрута и значения строки запроса используются только для простых типов». Итак, то, что вы пытаетесь сделать, к сожалению, невозможно.

GM_AM 06.08.2024 14:16

Хорошо, но спасибо за помощь

Maxim Rudolovskii 06.08.2024 14:40

Другие вопросы по теме