Передача данных в контроллер через строку запроса

Последнее обновление: 27.03.2022

Получение данных через строку запроса

Вместе с запросом приложению могут приходить различные данные. И чтобы получить эти данные, мы можем использовать разные способы. Самым распространенным способом считается применение параметров.

Определение в методах контроллера параметров ничем не отличается от определения параметров в языке 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:

Передача значений для параметров метода контроллера через строку запроса в ASP.NET Core MVC и C#

То есть в данном случае при обращении к методу 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.

Передача значений в действия контроллера через строку запроса в ASP.NET Core MVC и C#

Если же мы не используем параметры в строке запроса, то для параметров будут передаваться значения по умолчанию. Например, при отправке запроса https://localhost:7288/Home/Index параметры name и age будут иметь значения по умолчанию. Но на случай подобной ситуации мы можем использовать параметры по умолчанию, которые будут работать, если через строку запроса не передается никаких параметров:

public string Index(string name = "Bob", int age = 33)
{
    return $"Name: {name}  Age: {age}";
}
Значения по умолчанию в методах контроллера в ASP.NET Core MVC и C#

Передача сложных объектов

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

Передача сложных объектов в методы контроллера ASP.NET Core MVC в C#

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

Допустим, метод контроллера принимает массив строк-имен:

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
Передача массивов в контролер в ASP.NET Core MVC и C#

Можно явным образом указать индексы элементов:

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

Передача в метод словарей аналогично передаче массивов, только у передаваемых элементов необходимо установить ключ. Например, пусть некоторый метод получает в качестве параметра объект 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.Query

Параметры представляют самый простой способ получения данных, но в действительности нам необязательно их использовать. В контроллере доступен объект 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.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850