Контроллеры ASP.NET Core MVC. Передача данных в контроллер через параметры запроса

Данные в контроллер могут передаваться различными способами. Одним из широко используемых в настоящее время способов передачи данных в контроллер от пользователя является использование строки запроса (query string).

Параметры запроса

Схему URL можно представить следующим образом:

Схема URL

Параметры запроса на этой схеме выделены элементом QUERY и начинаются после знака вопроса в строке URL. В ASP.NET Core MVC мы можем передавать через параметры запроса как простые данные (строки, числа и т.д.) так и более сложные структуры, например массивы элементов.

Передача параметров в действие контроллера

Передача простых значений (строк, чисел и т.д.)

Создадим новое приложение ASP.NET Core MVC и добавим в него новый контроллер со следующим действием:

using Microsoft.AspNetCore.Mvc;

namespace FirstMvcSite.Controllers
{
    public class SimpleController : Controller
    {
        public string Inc(int number = 0)
        {
            return (++number).ToString(); 
        }
    }
}

здесь параметр метода number — это параметр запроса. При таком определении, в строке запроса в браузере мы должны использовать то же имя, что и в параметре метода, например,

https://localhost:[port]/simple/inc?number=3

Чтобы переопределить имя параметра в строке запроса, мы можем использовать для параметра метода атрибут [FromQuery] следующим образом:

public string Inc([FromQuery(Name = "num")]int number = 0)

в этом случае, в браузере мы можем задать такую строку запроса:

В строке запроса в браузере значение параметра должно совпадать со значением параметра в методе. Если типы значений не совпадают, то принимается значение по умолчанию. например:

Аналогичным образом, мы можем передавать в контроллер несколько значений. Например, добавим новое действие в контроллер:

public string Sum(int a = 0, int b = 0)
{
    return (a + b).ToString();
}

Результат выполнения действия в браузере:

Передача объектов

При необходимости, мы можем передавать в контроллер целые объекты. Например, создадим в папке Models нашего проекта такой класс:

namespace FirstMvcSite.Models
{
    public class UserModel
    {
        public int Id { get; set; }
        public string Name { get; set; } = string.Empty;
        public string Email { get; set; } = string.Empty;

    }
}

Теперь добавим новое действие в контроллер:

public string Register(UserModel model)
{
    return $"Пользователь {model.Name} ({model.Email}) зарегистрирован";
}

Это действие принимает в параметрах объект класса UserModel. Чтобы передать в строке запроса объект мы должны передать каждое свойство объекта отдельным параметром (регистр имен параметров при этом не учитывается), например на запрос:

localhost:7212/simple/register?Name=Vlad&email=vlad@mail.ru

мы получим следующий ответ:

Передача массивов

Для передачи массива в контроллер мы можем в качестве имен параметров использовать индексы элементов в массиве, или передать несколько параметров с одним именем. Например, добавим в контроллер новое действие:

public string Max(int[] num)
{
    return $"Максимальное значение в массиве {num.Max()}";
}

теперь мы можем передать в контроллер массив с помощью такого запроса:

localhost:7212/simple/maximum?num=10&num=2

или так:

localhost:7212/simple/maximum?num[0]=10&num[1]=2

или, даже, вот так:

localhost:7212/simple/maximum?[0]=10&[1]=2

результат будет один и тот же:

Передача массива объектов

Для передачи массива объектов необходимо совместить всё вышесказанное. То есть имя параметра должно содержать как индекс объекта в массиве, так и свойство объекта. Например, добавим в контроллер следующее действие:

public string List(UserModel[] user)
{
    return string.Join("\n", user.Select(x => $"{x.Name} - {x.Email}")) ;
}

теперь выполним следующий запрос:

localhost:7212/simple/list?user[0].Name=Sam&user[0].Email=sam@mail.com&user[1].Name=John&user[1].Email=john@mail.com

здесь мы передаем массив, состоящий из двух элементов. Результат:

Передача словарей

Как известно, словарь типа Dictionary<T,M> содержит элементы вида «ключ-значение». Чтобы передать в контроллер словарь, вместо индекса в имени параметра, в квадратных скобках передается значение ключа. Например,

public string Dict(Dictionary<string, string> data)
{
    string result = "";
    foreach (var item in data)
    {
        result = $"{result} {item.Key} - {item.Value}; ";
    }
    return result;
}

выполним такой запрос:

localhost:7212/simple/dict?data[fruit]=apple&data[people]=Sam&data[number]=One

Результат:

Итого

С использованием параметров запроса мы можем передавать в контроллер не только примитивные типы (числа, строки), но и сложные объекты, массивы объектов и словари. В каждом конкретном случае используются соглашения по именованию параметров. Например, указание порядкового номера элемента в массиве.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии