Содержание
Данные в контроллер могут передаваться различными способами. Одним из широко используемых в настоящее время способов передачи данных в контроллер от пользователя является использование строки запроса (query string).
Параметры запроса
Схему 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
Результат:
Итого
С использованием параметров запроса мы можем передавать в контроллер не только примитивные типы (числа, строки), но и сложные объекты, массивы объектов и словари. В каждом конкретном случае используются соглашения по именованию параметров. Например, указание порядкового номера элемента в массиве.