Как передать сложный объект C # с помощью FromQuery - PullRequest
0 голосов
/ 04 апреля 2019

В моем клиентском коде у меня есть такой объект:

{
  "selectedItems": [
    4016,
    3937
  ],
  "selectedStatuses": [],
  "search": "foo"
}

, который я хотел бы отобразить на C # DTO

public class FilterModel
{
    public List<int> SelectedItems { get; set; }
    public List<int> SelectedStatuses { get; set; }
    public string Search { get; set; }
}

Но он используется вПолучить запрос, поэтому я не могу передать его через FromBody только FromQuery.В действии контроллера уже есть основные параметры:

[HttpGet("{id}/filter/{typeId}")]
public async Task<IActionResult> GetFilteredData([FromRoute]int id, 
    [FromRoute]int typeId,
    [FromQuery]FilterModel filters = null)

На стороне клиента, я строю этот запрос, используя $ http в Angular.Как настроить мой вызов $ http для создания объекта фильтров в виде строки запроса?

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Проще говоря, имена ваших запросов должны быть такими же, какими они были бы, если бы они были входными именами, которые публикуются, т.е. filters.SelectedItems[] (повторяется для каждого элемента в списке), filters.SelectedStatuses[] (повторяется для каждого элемента в списке)и filters.Search.Например:

?filters.SelectedItems[]=item1&filters.SelectedItems[]=item2&filters.SelectedItems[]=item3&filters.SelectedStatuses[]=status1&filters.SelectedStatuses[]=status2&filters.SelectedStatuses[]=status3&filters.Search=keyword

Примечание: здесь есть немало возможностей, но в конечном итоге вы достигнете предела максимальной длины запроса.По большей части у вас не должно быть никаких проблем, но если вы начнете выбирать примерно 100 вещей, вам, вероятно, понадобится другой план.

FWIW, вы всегда можете просто использовать пост, особенноесли вы делаете это через AJAX, так как в любом случае это будет беспрепятственно для пользователя.

1 голос
/ 05 апреля 2019

Если вы используете ajax, простой способ - добавить traditional:true, чтобы использовать традиционный стиль сериализации параметров. См. здесь

var data =
        {
            "selectedItems": [
                4016,
                3937
            ],
            "selectedStatuses": [12, 34],
            "search": "foo"
        };
        $.ajax({
            url: "your url", //directly like /Home/{id}/filter/{typeId}              
            type: 'GET',
            data: data,
            traditional: true,
            success: function (result) {

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