Вместе с запросом приложению могут приходить различные данные. И чтобы получить эти данные, мы можем использовать разные способы. Самым распространенным способом считается применение параметров.
Определение в методах контроллера параметров ничем не отличается от определения параметров в языке C#. Например, определим в контроллере следующий метод:
using Microsoft.AspNetCore.Mvc; namespace MvcApp.Controllers { public class HomeController : Controller { public string Index(string name) => $"Your name: {name}"; } }
В данном случае метод Index из вне получает некоторую строку через параметр name.
Передавать значения для параметров можно различными способами. При отправке GET-запроса значения можно передать через строку запроса. Строка запроса представляет ту часть адреса, которая идет после знака вопроса ? и представляет набор параметров, где каждый параметр отделен от другого с помощью амперсанда:
название_ресурса?параметр1=значение1&параметр2=значение2
Например, в адресе:
https://localhost:7288/Home/Index?name=Tom&age=37
часть ?name=Tom&age=37
представляет строку запроса, которая содержит два параметра: name и age. Значение параметра name - "Tom", а значение параметра age - 37.
Например, передадим в выше определенный метод Index через строку запроса данные для параметра name:
То есть в данном случае при обращении к методу Index с запросом https://localhost:7288/Home/Index?name=Eugene
параметру name будет передаваться значение "Eugene".
Система привязки MVC, которую мы позже рассмотрим, по умолчанию сопоставляет параметры запроса и параметры метода по имени. То есть, если в строке запроса
идет параметр name
, то его значение будет передаваться именно параметру метода, который также называется name
. При этом должно быть также
соответствие по типу, то есть если параметр метода принимает числовое значение, то и через строку запроса надо передавать для этого параметра число, а не строку.
Подобным образом можно передать значения для нескольких параметров. Например, изменим метод Index следующим образом:
public string Index(string name, int age) { return $"Name: {name} Age: {age}"; }
В этом случае мы можем обратиться к действию, набрав в адресной строке https://localhost:7288/Home/Index?name=Tom&age=37.
Если же мы не используем параметры в строке запроса, то для параметров будут передаваться значения по умолчанию. Например, при отправке запроса https://localhost:7288/Home/Index параметры name и age будут иметь значения по умолчанию. Но на случай подобной ситуации мы можем использовать параметры по умолчанию, которые будут работать, если через строку запроса не передается никаких параметров:
public string Index(string name = "Bob", int age = 33) { return $"Name: {name} Age: {age}"; }
Хотя строка запроса преимущественно используется для передачи данных примитивных типов, но мы также можем принимать более сложные объекты. Например, определим рядом с контроллером класс Person:
using Microsoft.AspNetCore.Mvc; namespace MvcApp.Controllers { public class HomeController : Controller { public string Index(Person person) { return $"Person Name: {person.Name} Person Age: {person.Age}"; } } public record class Person(string Name, int Age); }
Класс Person определяет два свойства: Name и Age. И в контроллере HomeController метод Index принимает параметр типа Person. В этом случае значения через строку запроса передаются как и в предыдущем случае. При этом параметры строки запроса должны соответствовать по имени свойствам объекта. Регистр названий параметров при этом не учитывается:
Допустим, метод контроллера принимает массив строк-имен:
public class HomeController : Controller { public string Index(string[] people) { string result = ""; foreach (var person in people) result = $"{result}{person}; "; return result; } }
Для передачи методу данных через строку запроса применяется название параметра:
https://localhost:7288/Home/Index?people=Tom&people=Bob&people=Sam
Можно явным образом указать индексы элементов:
https://localhost:7288/Home/Index?people[0]=Tom&people[2]=Bob&people[1]=Sam
Можно просто ограничиться индексами:
https://localhost:7288/Home/Index?[0]=Tom&[2]=Bob&[1]=Sam
Подобным образом можно принимать массивы сложных объектов. Например, определим следующий метод, который принимает массив объектов выше некоторого класса Person:
public class HomeController : Controller { public string Index(Person[] people) { string result = ""; foreach (Person person in people) { result = $"{result} {person.Name}; "; } return result ; } } public record class Person(string Name, int Age);
И чтобы передать в этот метод данные, нам надо использовать запрос типа
https://localhost:7288/Home/Index?people[0].name=Tom&people[0].age=37&people[1].name=Bob&people[1].age=41
В этом случае в массиве people будут два объекта Person.
Также можно опустить название параметра и оставить только индексы:
https://localhost:7288/Home/Index?[0].name=Tom&[0].age=37&[1].name=Bob&[1].age=41
Передача в метод словарей аналогично передаче массивов, только у передаваемых элементов необходимо установить ключ. Например, пусть некоторый метод получает в качестве параметра объект Dictionary:
public string Index (Dictionary<string,string> items) { string result = ""; foreach (var item in items) { result = $"{result} {item.Key} - {item.Value}; "; } return result ; }
Для отправки данных мы можем использовать строку запроса:
https://localhost:7288/Home/Index?items[germany]=berlin&items[france]=paris&items[spain]=madrid
Каждый отдельный элемент этой строки типа items[germany]=berlin
будет представлять элемент словаря, где items
- название
словаря, "germany" - ключ, а "berlin" - значение.
Параметры представляют самый простой способ получения данных, но в действительности нам необязательно их использовать. В контроллере доступен объект Request,
у которого можно получить как данные строки запроса через свойство Request.Query. Это свойство представляет объект IQueryCollection
, где по
ключу - названию параметра можно получить его значение. Например:
public string Index() { string name = Request.Query["name"]; string age = Request.Query["age"]; return $"Name: {name} Age: {age}"; }
В данном случае мы можем передать методу Index данные через запрос типа https://localhost:7288/Home/Index?name=Tom&age=37.