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






