Часть 2. Добавление контроллера в приложение MVC ASP.NET Core
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 9 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 9 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 9 этой статьи.
Автор: Рик Андерсон (Rick Anderson)
Модель архитектуры MVC разделяет приложение на три основных компонента: модель, представление и контроллер. С помощью модели MVC можно создавать приложения, которые удобнее тестировать и обновлять по сравнению с традиционными монолитными приложениями.
Приложения на основе модели MVC содержат следующее:
- Модели (Models), то есть классы, представляющие данные в приложении. Классы модели используют логику проверки, которая позволяет применять бизнес-правила к этим данным. Как правило, объекты модели извлекают и сохраняют состояние модели в базе данных. В этом руководстве модель
Movie
извлекает сведения о фильмах из базы данных и передает их в представление или обновляет. Обновленные данные записываются в базу данных. - Представления (Views) — это компоненты, которые отображают пользовательский интерфейс приложения. Как правило, в пользовательском интерфейсе отображаются данные модели.
- Controllers: классы, которые:
- обрабатывают запросы браузера;
- получают данные модели;
- вызывают шаблоны представления вызовов, которые возвращают ответ.
В приложении MVC представление используется только для отображения информации. Контроллер обрабатывает и реагирует на ввод и взаимодействие пользователя. Например, контроллер обрабатывает сегменты URL-адреса и значения строки запроса и передает эти значения в модель. Модель может использовать эти значения для выполнения запросов к базе данных. Например:
https://localhost:5001/Home/Privacy
: задает контроллерHome
и действиеPrivacy
.https://localhost:5001/Movies/Edit/5
: это запрос на изменение фильма с ID=5 с помощью контроллераMovies
и действияEdit
, которые подробно описаны далее в этом руководстве.
Данные маршрута описаны далее в этом руководстве.
Структура архитектуры MVC разделяет приложение на три основных группы компонентов: модели, представления и контроллеры. Этот шаблон помогает реализовать принципы разделения задач: логика пользовательского интерфейса относится к представлению. Логика ввода относится к контроллеру. Бизнес-логика размещается в модели. Подобное разделение позволяет эффективно справляться с трудностями при построении приложения, поскольку оно дает возможность работать одновременно с одним аспектом реализации, не затрагивая при этом код других. Например, вы можете изменять код представления независимо от кода бизнес-логики.
Эти принципы продемонстрированы в этой серии руководств при создании приложения для работы с фильмами. Проект MVC содержит папки для контроллеров и представлений.
Добавление контроллера
В Обозревателе решений щелкните правой кнопкой мыши Контроллеры > Добавить > Контроллер.
В диалоговом окне Добавление нового шаблонного элемента выберите Контроллер MVC — пустой>Добавить.
В диалоговом окне Добавление нового элемента — MvcMovie введите HelloWorldController.cs
и щелкните Добавить.
Замените все содержимое Controllers/HelloWorldController.cs
следующим кодом:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers;
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
Каждый метод public
в контроллере вызывается как конечная точка HTTP. В приведенном выше примере оба метода возвращают строку. Обратите внимание на комментарии, предшествующие каждому методу.
Конечная точка HTTP:
- Это URL-адрес, который является целевым в веб-приложении, например
https://localhost:5001/HelloWorld
. - Сочетает:
- используемый протокол:
HTTPS
; - сетевое расположение веб-сервера, включая порт TCP:
localhost:5001
; - целевой универсальный код ресурса (URI):
HelloWorld
.
- используемый протокол:
В первом комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/
к базовому URL-адресу.
Во втором комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/Welcome/
к URL-адресу. Далее в этом руководстве используется механизм формирования шаблонов для создания методов HTTP POST
, которые обновляют данные.
Запустите приложение без отладчика, нажав клавиши CTRL+F5 (Windows) или «+F5» (macOS).
Добавьте /HelloWorld
путь в адресную строку. Метод Index
возвращает строку.
MVC вызывает классы контроллера (и методы действия в них) в зависимости от входящего URL-адреса. Логика маршрутизации URL-адресов, используемая моделью MVC по умолчанию, определяет вызываемый код на основе формата следующего вида:
/[Controller]/[ActionName]/[Parameters]
Формат маршрутизации задан в Program.cs
файле.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Если при переходе к приложению не указать сегменты URL-адреса, по умолчанию устанавливаются контроллер Home и метод Index, которые заданы в выделенной выше строке шаблона. В предшествующих сегментах URL-адресов:
- Первый сегмент URL-адреса определяет класс контроллера, который будет выполняться. Поэтому
localhost:5001/HelloWorld
сопоставляется с классом Controller HelloWorld. - Вторая часть сегмента URL-адреса определяет метод действия для класса. Таким образом,
localhost:5001/HelloWorld/Index
выполняет методIndex
классаHelloWorldController
. Обратите внимание, что в этом случае достаточно перейти по адресуlocalhost:5001/HelloWorld
, а методIndex
вызывается по умолчанию. Если имя вызываемого метода не указано явно, для контроллера вызывается метод по умолчаниюIndex
. - В третьей части сегмента URL-адреса (
id
) указываются данные маршрута. Данные маршрута описаны далее в этом руководстве.
Перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome
. Замените {PORT}
на номер порта.
Метод Welcome
запускается и возвращает строку This is the Welcome action method...
. Для этого URL-адреса заданы контроллер HelloWorld
и метод действия Welcome
. Часть URL-адреса [Parameters]
на данный момент еще не использовалась.
Измените код, чтобы передать сведения о параметрах из URL-адреса в контроллер. Например, /HelloWorld/Welcome?name=Rick&numtimes=4
.
Измените метод Welcome
, включив два параметра, как показано в следующем коде.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
Предыдущий код:
- Использует функцию необязательного параметра C#, указывая, что параметр
numTimes
по умолчанию принимает значение 1, если ему не было передано значение. - Использует
HtmlEncoder.Default.Encode
для защиты приложения от злонамеренного ввода данных (например, JavaScript). - Использует интерполированные строки в
$"Hello {name}, NumTimes is: {numTimes}"
.
Запустите приложение и перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Замените {PORT}
на номер порта.
Попробуйте использовать разные значения для name
и numtimes
в URL-адресе. Система привязки модели MVC автоматически сопоставляет именованные параметры из строки запроса с параметрами метода. Дополнительные сведения см. в разделе Привязка модели.
На предыдущем рисунке:
- Сегмент URL-адреса
Parameters
не используется. - Параметры
name
иnumTimes
передаются в строку запроса. - Вопросительный знак (
?
) в приведенном выше URL-адресе используется в качестве разделителя, после которого указывается строка запроса. - Символом
&
отделяются пары "поле-значение".
Замените метод Welcome
следующим кодом:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Запустите приложение и введите следующий URL-адрес: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
В предыдущем URL-адресе:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
указывает на начало строки запроса.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
В предыдущем примере:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
(вid?
) указывает, что параметрid
является необязательным.
Модель архитектуры MVC разделяет приложение на три основных компонента: модель, представление и контроллер. С помощью модели MVC можно создавать приложения, которые удобнее тестировать и обновлять по сравнению с традиционными монолитными приложениями.
Приложения на основе модели MVC содержат следующее:
- Модели (Models), то есть классы, представляющие данные в приложении. Классы модели используют логику проверки, которая позволяет применять бизнес-правила к этим данным. Как правило, объекты модели извлекают и сохраняют состояние модели в базе данных. В этом руководстве модель
Movie
извлекает сведения о фильмах из базы данных и передает их в представление или обновляет. Обновленные данные записываются в базу данных. - Представления (Views) — это компоненты, которые отображают пользовательский интерфейс приложения. Как правило, в пользовательском интерфейсе отображаются данные модели.
- Controllers: классы, которые:
- обрабатывают запросы браузера;
- получают данные модели;
- вызывают шаблоны представления вызовов, которые возвращают ответ.
В приложении MVC представление используется только для отображения информации. Контроллер обрабатывает и реагирует на ввод и взаимодействие пользователя. Например, контроллер обрабатывает сегменты URL-адреса и значения строки запроса и передает эти значения в модель. Модель может использовать эти значения для выполнения запросов к базе данных. Например:
https://localhost:5001/Home/Privacy
: задает контроллерHome
и действиеPrivacy
.https://localhost:5001/Movies/Edit/5
: это запрос на изменение фильма с ID=5 с помощью контроллераMovies
и действияEdit
, которые подробно описаны далее в этом руководстве.
Данные маршрута описаны далее в этом руководстве.
Структура архитектуры MVC разделяет приложение на три основных группы компонентов: модели, представления и контроллеры. Этот шаблон помогает реализовать принципы разделения задач: логика пользовательского интерфейса относится к представлению. Логика ввода относится к контроллеру. Бизнес-логика размещается в модели. Подобное разделение позволяет эффективно справляться с трудностями при построении приложения, поскольку оно дает возможность работать одновременно с одним аспектом реализации, не затрагивая при этом код других. Например, вы можете изменять код представления независимо от кода бизнес-логики.
Эти принципы продемонстрированы в этой серии руководств при создании приложения для работы с фильмами. Проект MVC содержит папки для контроллеров и представлений.
Добавление контроллера
В Обозревателе решений щелкните правой кнопкой мыши Контроллеры > Добавить > Контроллер.
В диалоговом окне Добавление нового шаблонного элемента выберите Контроллер MVC — пустой>Добавить.
В диалоговом окне Добавление нового элемента — MvcMovie введите HelloWorldController.cs
и щелкните Добавить.
Замените все содержимое Controllers/HelloWorldController.cs
следующим кодом:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers;
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
Каждый метод public
в контроллере вызывается как конечная точка HTTP. В приведенном выше примере оба метода возвращают строку. Обратите внимание на комментарии, предшествующие каждому методу.
Конечная точка HTTP:
- Это URL-адрес, который является целевым в веб-приложении, например
https://localhost:5001/HelloWorld
. - Сочетает:
- используемый протокол:
HTTPS
; - сетевое расположение веб-сервера, включая порт TCP:
localhost:5001
; - целевой универсальный код ресурса (URI):
HelloWorld
.
- используемый протокол:
В первом комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/
к базовому URL-адресу.
Во втором комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/Welcome/
к URL-адресу. Далее в этом руководстве используется механизм формирования шаблонов для создания методов HTTP POST
, которые обновляют данные.
Запустите приложение без отладчика, нажав клавиши CTRL+F5 (Windows) или «+F5» (macOS).
Добавьте /HelloWorld
путь в адресную строку. Метод Index
возвращает строку.
MVC вызывает классы контроллера (и методы действия в них) в зависимости от входящего URL-адреса. Логика маршрутизации URL-адресов, используемая моделью MVC по умолчанию, определяет вызываемый код на основе формата следующего вида:
/[Controller]/[ActionName]/[Parameters]
Формат маршрутизации задан в Program.cs
файле.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Если при переходе к приложению не указать сегменты URL-адреса, по умолчанию устанавливаются контроллер Home и метод Index, которые заданы в выделенной выше строке шаблона. В предшествующих сегментах URL-адресов:
- Первый сегмент URL-адреса определяет класс контроллера, который будет выполняться. Поэтому
localhost:5001/HelloWorld
сопоставляется с классом Controller HelloWorld. - Вторая часть сегмента URL-адреса определяет метод действия для класса. Таким образом,
localhost:5001/HelloWorld/Index
выполняет методIndex
классаHelloWorldController
. Обратите внимание, что в этом случае достаточно перейти по адресуlocalhost:5001/HelloWorld
, а методIndex
вызывается по умолчанию. Если имя вызываемого метода не указано явно, для контроллера вызывается метод по умолчаниюIndex
. - В третьей части сегмента URL-адреса (
id
) указываются данные маршрута. Данные маршрута описаны далее в этом руководстве.
Перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome
. Замените {PORT}
на номер порта.
Метод Welcome
запускается и возвращает строку This is the Welcome action method...
. Для этого URL-адреса заданы контроллер HelloWorld
и метод действия Welcome
. Часть URL-адреса [Parameters]
на данный момент еще не использовалась.
Измените код, чтобы передать сведения о параметрах из URL-адреса в контроллер. Например, /HelloWorld/Welcome?name=Rick&numtimes=4
.
Измените метод Welcome
, включив два параметра, как показано в следующем коде.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
Предыдущий код:
- Использует функцию необязательного параметра C#, указывая, что параметр
numTimes
по умолчанию принимает значение 1, если ему не было передано значение. - Использует
HtmlEncoder.Default.Encode
для защиты приложения от злонамеренного ввода данных (например, JavaScript). - Использует интерполированные строки в
$"Hello {name}, NumTimes is: {numTimes}"
.
Запустите приложение и перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Замените {PORT}
на номер порта.
Попробуйте использовать разные значения для name
и numtimes
в URL-адресе. Система привязки модели MVC автоматически сопоставляет именованные параметры из строки запроса с параметрами метода. Дополнительные сведения см. в разделе Привязка модели.
На предыдущем рисунке:
- Сегмент URL-адреса
Parameters
не используется. - Параметры
name
иnumTimes
передаются в строку запроса. - Вопросительный знак (
?
) в приведенном выше URL-адресе используется в качестве разделителя, после которого указывается строка запроса. - Символом
&
отделяются пары "поле-значение".
Замените метод Welcome
следующим кодом:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Запустите приложение и введите следующий URL-адрес: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
В предыдущем URL-адресе:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
указывает на начало строки запроса.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
В предыдущем примере:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
(вid?
) указывает, что параметрid
является необязательным.
Модель архитектуры MVC разделяет приложение на три основных компонента: модель, представление и контроллер. С помощью модели MVC можно создавать приложения, которые удобнее тестировать и обновлять по сравнению с традиционными монолитными приложениями.
Приложения на основе модели MVC содержат следующее:
- Модели (Models), то есть классы, представляющие данные в приложении. Классы модели используют логику проверки, которая позволяет применять бизнес-правила к этим данным. Как правило, объекты модели извлекают и сохраняют состояние модели в базе данных. В этом руководстве модель
Movie
извлекает сведения о фильмах из базы данных и передает их в представление или обновляет. Обновленные данные записываются в базу данных. - Представления (Views) — это компоненты, которые отображают пользовательский интерфейс приложения. Как правило, в пользовательском интерфейсе отображаются данные модели.
- Controllers: классы, которые:
- обрабатывают запросы браузера;
- получают данные модели;
- вызывают шаблоны представления вызовов, которые возвращают ответ.
В приложении MVC представление используется только для отображения информации. Контроллер обрабатывает и реагирует на ввод и взаимодействие пользователя. Например, контроллер обрабатывает сегменты URL-адреса и значения строки запроса и передает эти значения в модель. Модель может использовать эти значения для выполнения запросов к базе данных. Например:
https://localhost:5001/Home/Privacy
: задает контроллерHome
и действиеPrivacy
.https://localhost:5001/Movies/Edit/5
: это запрос на изменение фильма с ID=5 с помощью контроллераMovies
и действияEdit
, которые подробно описаны далее в этом руководстве.
Данные маршрута описаны далее в этом руководстве.
Структура архитектуры MVC разделяет приложение на три основных группы компонентов: модели, представления и контроллеры. Этот шаблон помогает реализовать принципы разделения задач: логика пользовательского интерфейса относится к представлению. Логика ввода относится к контроллеру. Бизнес-логика размещается в модели. Подобное разделение позволяет эффективно справляться с трудностями при построении приложения, поскольку оно дает возможность работать одновременно с одним аспектом реализации, не затрагивая при этом код других. Например, вы можете изменять код представления независимо от кода бизнес-логики.
Эти принципы продемонстрированы в этой серии руководств при создании приложения для работы с фильмами. Проект MVC содержит папки для контроллеров и представлений.
Добавление контроллера
В Обозревателе решений щелкните правой кнопкой мыши Контроллеры > Добавить > Контроллер.
В диалоговом окне Добавление нового шаблонного элемента выберите Контроллер MVC — пустой>Добавить.
В диалоговом окне Добавление нового элемента — MvcMovie введите HelloWorldController.cs
и щелкните Добавить.
Замените все содержимое Controllers/HelloWorldController.cs
следующим кодом:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers;
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
Каждый метод public
в контроллере вызывается как конечная точка HTTP. В приведенном выше примере оба метода возвращают строку. Обратите внимание на комментарии, предшествующие каждому методу.
Конечная точка HTTP:
- Это URL-адрес, который является целевым в веб-приложении, например
https://localhost:5001/HelloWorld
. - Сочетает:
- используемый протокол:
HTTPS
; - сетевое расположение веб-сервера, включая порт TCP:
localhost:5001
; - целевой универсальный код ресурса (URI):
HelloWorld
.
- используемый протокол:
В первом комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/
к базовому URL-адресу.
Во втором комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/Welcome/
к URL-адресу. Далее в этом руководстве используется механизм формирования шаблонов для создания методов HTTP POST
, которые обновляют данные.
Запустите приложение без отладчика, нажав клавиши CTRL+F5 (Windows) или «+F5» (macOS).
Добавьте /HelloWorld
путь в адресную строку. Метод Index
возвращает строку.
MVC вызывает классы контроллера (и методы действия в них) в зависимости от входящего URL-адреса. Логика маршрутизации URL-адресов, используемая моделью MVC по умолчанию, определяет вызываемый код на основе формата следующего вида:
/[Controller]/[ActionName]/[Parameters]
Формат маршрутизации задан в Program.cs
файле.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Если при переходе к приложению не указать сегменты URL-адреса, по умолчанию устанавливаются контроллер Home и метод Index, которые заданы в выделенной выше строке шаблона. В предшествующих сегментах URL-адресов:
- Первый сегмент URL-адреса определяет класс контроллера, который будет выполняться. Поэтому
localhost:5001/HelloWorld
сопоставляется с классом Controller HelloWorld. - Вторая часть сегмента URL-адреса определяет метод действия для класса. Таким образом,
localhost:5001/HelloWorld/Index
выполняет методIndex
классаHelloWorldController
. Обратите внимание, что в этом случае достаточно перейти по адресуlocalhost:5001/HelloWorld
, а методIndex
вызывается по умолчанию. Если имя вызываемого метода не указано явно, для контроллера вызывается метод по умолчаниюIndex
. - В третьей части сегмента URL-адреса (
id
) указываются данные маршрута. Данные маршрута описаны далее в этом руководстве.
Перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome
. Замените {PORT}
на номер порта.
Метод Welcome
запускается и возвращает строку This is the Welcome action method...
. Для этого URL-адреса заданы контроллер HelloWorld
и метод действия Welcome
. Часть URL-адреса [Parameters]
на данный момент еще не использовалась.
Измените код, чтобы передать сведения о параметрах из URL-адреса в контроллер. Например, /HelloWorld/Welcome?name=Rick&numtimes=4
.
Измените метод Welcome
, включив два параметра, как показано в следующем коде.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
Предыдущий код:
- Использует функцию необязательного параметра C#, указывая, что параметр
numTimes
по умолчанию принимает значение 1, если ему не было передано значение. - Использует
HtmlEncoder.Default.Encode
для защиты приложения от злонамеренного ввода данных (например, JavaScript). - Использует интерполированные строки в
$"Hello {name}, NumTimes is: {numTimes}"
.
Запустите приложение и перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Замените {PORT}
на номер порта.
Попробуйте использовать разные значения для name
и numtimes
в URL-адресе. Система привязки модели MVC автоматически сопоставляет именованные параметры из строки запроса с параметрами метода. Дополнительные сведения см. в разделе Привязка модели.
На предыдущем рисунке:
- Сегмент URL-адреса
Parameters
не используется. - Параметры
name
иnumTimes
передаются в строку запроса. - Вопросительный знак (
?
) в приведенном выше URL-адресе используется в качестве разделителя, после которого указывается строка запроса. - Символом
&
отделяются пары "поле-значение".
Замените метод Welcome
следующим кодом:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Запустите приложение и введите следующий URL-адрес: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
В предыдущем URL-адресе:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
указывает на начало строки запроса.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
В предыдущем примере:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
(вid?
) указывает, что параметрid
является необязательным.
Модель архитектуры MVC разделяет приложение на три основных компонента: модель, представление и контроллер. С помощью модели MVC можно создавать приложения, которые удобнее тестировать и обновлять по сравнению с традиционными монолитными приложениями.
Приложения на основе модели MVC содержат следующее:
- Модели (Models), то есть классы, представляющие данные в приложении. Классы модели используют логику проверки, которая позволяет применять бизнес-правила к этим данным. Как правило, объекты модели извлекают и сохраняют состояние модели в базе данных. В этом руководстве модель
Movie
извлекает сведения о фильмах из базы данных и передает их в представление или обновляет. Обновленные данные записываются в базу данных. - Представления (Views) — это компоненты, которые отображают пользовательский интерфейс приложения. Как правило, в пользовательском интерфейсе отображаются данные модели.
- Controllers: классы, которые:
- обрабатывают запросы браузера;
- получают данные модели;
- вызывают шаблоны представления вызовов, которые возвращают ответ.
В приложении MVC представление используется только для отображения информации. Контроллер обрабатывает и реагирует на ввод и взаимодействие пользователя. Например, контроллер обрабатывает сегменты URL-адреса и значения строки запроса и передает эти значения в модель. Модель может использовать эти значения для выполнения запросов к базе данных. Например:
https://localhost:5001/Home/Privacy
: задает контроллерHome
и действиеPrivacy
.https://localhost:5001/Movies/Edit/5
: это запрос на изменение фильма с ID=5 с помощью контроллераMovies
и действияEdit
, которые подробно описаны далее в этом руководстве.
Данные маршрута описаны далее в этом руководстве.
Структура архитектуры MVC разделяет приложение на три основных группы компонентов: модели, представления и контроллеры. Этот шаблон помогает реализовать принципы разделения задач: логика пользовательского интерфейса относится к представлению. Логика ввода относится к контроллеру. Бизнес-логика размещается в модели. Подобное разделение позволяет эффективно справляться с трудностями при построении приложения, поскольку оно дает возможность работать одновременно с одним аспектом реализации, не затрагивая при этом код других. Например, вы можете изменять код представления независимо от кода бизнес-логики.
Эти принципы продемонстрированы в этой серии руководств при создании приложения для работы с фильмами. Проект MVC содержит папки для контроллеров и представлений.
Добавление контроллера
В Обозревателе решений щелкните правой кнопкой мыши Контроллеры > Добавить > Контроллер.
В диалоговом окне Добавление нового шаблонного элемента выберите Контроллер MVC — пустой>Добавить.
В диалоговом окне Добавление нового элемента — MvcMovie введите HelloWorldController.cs
и щелкните Добавить.
Замените все содержимое Controllers/HelloWorldController.cs
следующим кодом:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
}
Каждый метод public
в контроллере вызывается как конечная точка HTTP. В приведенном выше примере оба метода возвращают строку. Обратите внимание на комментарии, предшествующие каждому методу.
Конечная точка HTTP:
- Это URL-адрес, который является целевым в веб-приложении, например
https://localhost:5001/HelloWorld
. - Сочетает:
- используемый протокол:
HTTPS
; - сетевое расположение веб-сервера, включая порт TCP:
localhost:5001
; - целевой универсальный код ресурса (URI):
HelloWorld
.
- используемый протокол:
В первом комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/
к базовому URL-адресу.
Во втором комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/Welcome/
к URL-адресу. Далее в этом руководстве используется механизм формирования шаблонов для создания методов HTTP POST
, которые обновляют данные.
Запустите приложение без отладчика.
Добавьте "HelloWorld" к пути в адресной строке. Метод Index
возвращает строку.
MVC вызывает классы контроллера (и методы действия в них) в зависимости от входящего URL-адреса. Логика маршрутизации URL-адресов, используемая моделью MVC по умолчанию, определяет вызываемый код на основе формата следующего вида:
/[Controller]/[ActionName]/[Parameters]
Формат маршрутизации задан в Program.cs
файле.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
Если при переходе к приложению не указать сегменты URL-адреса, по умолчанию устанавливаются контроллер Home и метод Index, которые заданы в выделенной выше строке шаблона. В предшествующих сегментах URL-адресов:
- Первый сегмент URL-адреса определяет класс контроллера, который будет выполняться. Поэтому
localhost:5001/HelloWorld
сопоставляется с классом Controller HelloWorld. - Вторая часть сегмента URL-адреса определяет метод действия для класса. Таким образом,
localhost:5001/HelloWorld/Index
выполняет методIndex
классаHelloWorldController
. Обратите внимание, что в этом случае достаточно перейти по адресуlocalhost:5001/HelloWorld
, а методIndex
вызывается по умолчанию. Если имя вызываемого метода не указано явно, для контроллера вызывается метод по умолчаниюIndex
. - В третьей части сегмента URL-адреса (
id
) указываются данные маршрута. Данные маршрута описаны далее в этом руководстве.
Перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome
. Замените {PORT}
на номер порта.
Метод Welcome
запускается и возвращает строку This is the Welcome action method...
. Для этого URL-адреса заданы контроллер HelloWorld
и метод действия Welcome
. Часть URL-адреса [Parameters]
на данный момент еще не использовалась.
Измените код, чтобы передать сведения о параметрах из URL-адреса в контроллер. Например, /HelloWorld/Welcome?name=Rick&numtimes=4
.
Измените метод Welcome
, включив два параметра, как показано в следующем коде.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
Предыдущий код:
- Использует функцию необязательного параметра C#, указывая, что параметр
numTimes
по умолчанию принимает значение 1, если ему не было передано значение. - Использует
HtmlEncoder.Default.Encode
для защиты приложения от злонамеренного ввода данных (например, JavaScript). - Использует интерполированные строки в
$"Hello {name}, NumTimes is: {numTimes}"
.
Запустите приложение и перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Замените {PORT}
на номер порта.
Попробуйте использовать разные значения для name
и numtimes
в URL-адресе. Система привязки модели MVC автоматически сопоставляет именованные параметры из строки запроса с параметрами метода. Дополнительные сведения см. в разделе Привязка модели.
На предыдущем рисунке:
- Сегмент URL-адреса
Parameters
не используется. - Параметры
name
иnumTimes
передаются в строку запроса. - Вопросительный знак (
?
) в приведенном выше URL-адресе используется в качестве разделителя, после которого указывается строка запроса. - Символом
&
отделяются пары "поле-значение".
Замените метод Welcome
следующим кодом:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Запустите приложение и введите следующий URL-адрес: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
В предыдущем URL-адресе:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
указывает на начало строки запроса.
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
В предыдущем примере:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
(вid?
) указывает, что параметрid
является необязательным.
Модель архитектуры MVC разделяет приложение на три основных компонента: модель, представление и контроллер. С помощью модели MVC можно создавать приложения, которые удобнее тестировать и обновлять по сравнению с традиционными монолитными приложениями.
Приложения на основе модели MVC содержат следующее:
- Модели (Models), то есть классы, представляющие данные в приложении. Классы модели используют логику проверки, которая позволяет применять бизнес-правила к этим данным. Как правило, объекты модели извлекают и сохраняют состояние модели в базе данных. В этом руководстве модель
Movie
извлекает сведения о фильмах из базы данных и передает их в представление или обновляет. Обновленные данные записываются в базу данных. - Представления (Views) — это компоненты, которые отображают пользовательский интерфейс приложения. Как правило, в пользовательском интерфейсе отображаются данные модели.
- Controllers: классы, которые:
- обрабатывают запросы браузера;
- получают данные модели;
- вызывают шаблоны представления вызовов, которые возвращают ответ.
В приложении MVC представление используется только для отображения информации. Контроллер обрабатывает и реагирует на ввод и взаимодействие пользователя. Например, контроллер обрабатывает сегменты URL-адреса и значения строки запроса и передает эти значения в модель. Модель может использовать эти значения для выполнения запросов к базе данных. Например:
https://localhost:5001/Home/Privacy
: задает контроллерHome
и действиеPrivacy
.https://localhost:5001/Movies/Edit/5
: это запрос на изменение фильма с ID=5 с помощью контроллераMovies
и действияEdit
, которые подробно описаны далее в этом руководстве.
Данные маршрута описаны далее в этом руководстве.
Структура архитектуры MVC разделяет приложение на три основных группы компонентов: модели, представления и контроллеры. Этот шаблон помогает реализовать принципы разделения задач: логика пользовательского интерфейса относится к представлению. Логика ввода относится к контроллеру. Бизнес-логика размещается в модели. Подобное разделение позволяет эффективно справляться с трудностями при построении приложения, поскольку оно дает возможность работать одновременно с одним аспектом реализации, не затрагивая при этом код других. Например, вы можете изменять код представления независимо от кода бизнес-логики.
Эти принципы продемонстрированы в этой серии руководств при создании приложения для работы с фильмами. Проект MVC содержит папки для контроллеров и представлений.
Добавление контроллера
В Обозревателе решений щелкните правой кнопкой мыши Контроллеры > Добавить > Контроллер.
В диалоговом окне Добавление шаблона выберите Контроллер MVC — пустой.
В диалоговом окне Добавление нового элемента — MvcMovie введите HelloWorldController.cs
и щелкните Добавить.
Замените все содержимое Controllers/HelloWorldController.cs
следующим:
using Microsoft.AspNetCore.Mvc;
using System.Text.Encodings.Web;
namespace MvcMovie.Controllers
{
public class HelloWorldController : Controller
{
//
// GET: /HelloWorld/
public string Index()
{
return "This is my default action...";
}
//
// GET: /HelloWorld/Welcome/
public string Welcome()
{
return "This is the Welcome action method...";
}
}
}
Каждый метод public
в контроллере вызывается как конечная точка HTTP. В приведенном выше примере оба метода возвращают строку. Обратите внимание на комментарии, предшествующие каждому методу.
Конечная точка HTTP:
- Это URL-адрес, который является целевым в веб-приложении, например
https://localhost:5001/HelloWorld
. - Сочетает:
- используемый протокол:
HTTPS
; - сетевое расположение веб-сервера, включая порт TCP:
localhost:5001
; - целевой универсальный код ресурса (URI):
HelloWorld
.
- используемый протокол:
В первом комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/
к базовому URL-адресу.
Во втором комментарии указано, что этот метод HTTP GET вызывается путем добавления /HelloWorld/Welcome/
к URL-адресу. Далее в этом руководстве используется механизм формирования шаблонов для создания методов HTTP POST
, которые обновляют данные.
Запустите приложение без отладчика.
Добавьте "HelloWorld" к пути в адресной строке. Метод Index
возвращает строку.
MVC вызывает классы контроллера (и методы действия в них) в зависимости от входящего URL-адреса. Логика маршрутизации URL-адресов, используемая моделью MVC по умолчанию, определяет вызываемый код на основе формата следующего вида:
/[Controller]/[ActionName]/[Parameters]
Формат маршрутизации задан в методе Configure
в Startup.cs
файле.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Если при переходе к приложению не указать сегменты URL-адреса, по умолчанию устанавливаются контроллер Home и метод Index, которые заданы в выделенной выше строке шаблона. В предшествующих сегментах URL-адресов:
- Первый сегмент URL-адреса определяет класс контроллера, который будет выполняться. Поэтому
localhost:5001/HelloWorld
сопоставляется с классом HelloWorldController. - Вторая часть сегмента URL-адреса определяет метод действия для класса. Таким образом,
localhost:5001/HelloWorld/Index
выполняет методIndex
классаHelloWorldController
. Обратите внимание, что в этом случае достаточно перейти по адресуlocalhost:5001/HelloWorld
, а методIndex
вызывается по умолчанию. Если имя вызываемого метода не указано явно, для контроллера вызывается метод по умолчаниюIndex
. - В третьей части сегмента URL-адреса (
id
) указываются данные маршрута. Данные маршрута описаны далее в этом руководстве.
Перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome
. Замените {PORT}
на номер порта.
Метод Welcome
запускается и возвращает строку This is the Welcome action method...
. Для этого URL-адреса заданы контроллер HelloWorld
и метод действия Welcome
. Часть URL-адреса [Parameters]
на данный момент еще не использовалась.
Измените код, чтобы передать сведения о параметрах из URL-адреса в контроллер. Например, /HelloWorld/Welcome?name=Rick&numtimes=4
.
Измените метод Welcome
, включив два параметра, как показано в следующем коде.
// GET: /HelloWorld/Welcome/
// Requires using System.Text.Encodings.Web;
public string Welcome(string name, int numTimes = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, NumTimes is: {numTimes}");
}
Предыдущий код:
- Использует функцию необязательного параметра C#, указывая, что параметр
numTimes
по умолчанию принимает значение 1, если ему не было передано значение. - Использует
HtmlEncoder.Default.Encode
для защиты приложения от злонамеренного ввода данных (например, JavaScript). - Использует интерполированные строки в
$"Hello {name}, NumTimes is: {numTimes}"
.
Запустите приложение и перейдите по адресу https://localhost:{PORT}/HelloWorld/Welcome?name=Rick&numtimes=4
. Замените {PORT}
на номер порта.
Попробуйте использовать разные значения для name
и numtimes
в URL-адресе. Система привязки модели MVC автоматически сопоставляет именованные параметры из строки запроса с параметрами метода. Дополнительные сведения см. в разделе Привязка модели.
На предыдущем рисунке:
- Сегмент URL-адреса
Parameters
не используется. - Параметры
name
иnumTimes
передаются в строку запроса. - Вопросительный знак (
?
) в приведенном выше URL-адресе используется в качестве разделителя, после которого указывается строка запроса. - Символом
&
отделяются пары "поле-значение".
Замените метод Welcome
следующим кодом:
public string Welcome(string name, int ID = 1)
{
return HtmlEncoder.Default.Encode($"Hello {name}, ID: {ID}");
}
Запустите приложение и введите следующий URL-адрес: https://localhost:{PORT}/HelloWorld/Welcome/3?name=Rick
В предыдущем URL-адресе:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
указывает на начало строки запроса.
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
В предыдущем примере:
- Третий сегмент URL-адреса сопоставляется с параметром маршрута
id
. - Метод
Welcome
содержит параметрid
, который сопоставляется с шаблоном URL-адреса в методеMapControllerRoute
. - Завершающий символ
?
(вid?
) указывает, что параметрid
является необязательным.
ASP.NET Core