Добавление нового контроллера

Рик Андерсон

Замечание

Обновленная версия этого руководства доступна здесь , используя последнюю версию Visual Studio. В новом руководстве используется ASP.NET Core MVC, который предоставляет множество улучшений в этом руководстве.

В этом руководстве рассматривается ASP.NET Core MVC с контроллерами и представлениями. Razor Pages — это новая альтернатива в ASP.NET Core, модель программирования на основе страниц, которая упрощает создание веб-интерфейса и повышает производительность. Рекомендуется ознакомиться с руководством razor Pages перед версией MVC. Руководство по Razor Pages:

  • Следовать проще.
  • Подробнее о функциях.
  • Предпочтительный подход для разработки новых приложений.

MVC обозначает модель-представление-контроллер. MVC — это паттерн разработки приложений, которые хорошо спроектированные, поддающиеся тестированию и простые в обслуживании. Приложения на основе MVC содержат следующее:

  • M odels: классы, представляющие данные приложения и использующие логику проверки для применения бизнес-правил для этих данных.
  • V iews: файлы шаблонов, которые приложение использует для динамического создания ответов HTML.
  • C ontrollers: классы, обрабатывающие входящие запросы браузера, извлекают данные модели, а затем указывают шаблоны представлений, возвращающие ответ браузеру.

Мы рассмотрим все эти понятия в этой серии учебников и покажем, как использовать их для создания приложения.

Начнем с создания класса контроллера. В обозревателе решений щелкните правой кнопкой мыши папку "Контроллеры" , а затем нажмите кнопку "Добавить", а затем " Контроллер".

Снимок экрана, показывающий окно обозревателя решений. Меню

В диалоговом окне Добавить шаблон щелкните Контроллер MVC 5 (пустой), а затем нажмите Добавить.

Снимок экрана, показывающий диалоговое окно

Назовите новый контроллер HelloWorldController и нажмите кнопку "Добавить".

добавление контроллера

Обратите внимание, что в обозревателе решений был создан новый файл с именем HelloWorldController.cs и новой папкой Views\HelloWorld. Контроллер открыт в интегрированной среде разработки.

Снимок экрана, на котором открыт файл HelloWorldController.cs. В обозревателе решений обведены красным цветом папка

Замените содержимое файла следующим кодом.

using System.Web;
using System.Web.Mvc; 
 
namespace MvcMovie.Controllers 
{ 
    public class HelloWorldController : Controller 
    { 
        // 
        // GET: /HelloWorld/ 
 
        public string Index() 
        { 
            return "This is my <b>default</b> action..."; 
        } 
 
        // 
        // GET: /HelloWorld/Welcome/ 
 
        public string Welcome() 
        { 
            return "This is the Welcome action method..."; 
        } 
    } 
}

Методы контроллера возвращают строку HTML в качестве примера. Контроллер называется HelloWorldController , а первый метод называется Index. Давайте вызовем его из браузера. Запустите приложение (нажмите клавишу F5 или CTRL+F5). В браузере добавьте "HelloWorld" в путь в адресной строке. (Например, на рисунке ниже это ) http://localhost:1234/HelloWorld. Страница в браузере будет выглядеть так, как показано на следующем снимке экрана. В приведенном выше методе код вернул строку напрямую. Вы сказали системе просто вернуть html-код, и это сделал!

Снимок экрана: вкладка локального узла с текстом

ASP.NET MVC вызывает различные классы контроллеров (и различные методы действий в них) в зависимости от входящего URL-адреса. Логика маршрутизации URL-адресов по умолчанию, используемая ASP.NET MVC, использует такой формат, чтобы определить, какой код следует вызвать:

/[Controller]/[ActionName]/[Parameters]

Вы устанавливаете формат маршрутизации в файле App_Start/RouteConfig.cs.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

Когда вы запускаете приложение и не предоставляете сегменты URL-адресов, по умолчанию используется контроллер "Главная" и метод действия Index, указанный в разделе по умолчанию кода выше.

Первая часть URL-адреса определяет класс контроллера для выполнения. Поэтому /HelloWorld сопоставляется с классом HelloWorldController . Вторая часть URL-адреса определяет метод действия в классе, который нужно выполнить. Таким образом, /HelloWorld/Index приведёт к выполнению метода Index в классе HelloWorldController. Обратите внимание, что нам пришлось перейти к /HelloWorld, а метод Index использовался по умолчанию. Это связано с тем, что метод с именем Index является методом по умолчанию, который будет вызываться на контроллере, если он не указан явным образом. В третьей части сегмента URL-адреса (Parameters) указываются данные маршрута. Данные маршрута мы увидим позже в этом руководстве.

Перейдите по ссылке http://localhost:xxxx/HelloWorld/Welcome. Выполняется метод Welcome, который возвращает строку "This is the Welcome action method..." (Это метод действия Welcome...). Сопоставление MVC по умолчанию - /[Controller]/[ActionName]/[Parameters]. Для этого URL-адреса заданы контроллер HelloWorld и метод действия Welcome. Часть URL-адреса [Parameters] на данный момент еще не использовалась.

Снимок экрана: вкладка локального хоста с текстом Это метод действия Welcome в окне.

Давайте немного изменим пример, чтобы передать некоторые сведения о параметрах из URL-адреса контроллера (например, /HelloWorld/Welcome?name=Scott&numtimes=4). Измените Welcome метод, чтобы включить два параметра, как показано ниже. Обратите внимание, что код использует функцию необязательного параметра C#, чтобы указать, что numTimes параметр по умолчанию должен иметь значение 1, если значение для этого параметра не передается.

public string Welcome(string name, int numTimes = 1) {
     return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}

Замечание

Примечание по безопасности. Приведенный выше код использует HttpUtility.HtmlEncode для защиты приложения от вредоносных входных данных (а именно JavaScript). Дополнительные сведения см. в разделе "Практическое руководство. Защита от эксплойтов скриптов в веб-приложении путем применения кодировки HTML к строкам".

Запустите приложение и перейдите по примеру URL-адреса (http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4). Вы можете попробовать различные значения name и numtimes в URL-адресе. Система привязки модели MVC ASP.NET автоматически сопоставляет именованные параметры из строки запроса в адресной строке с параметрами в методе.

Снимок экрана, показывающий окно браузера с URL localhost:1234/HelloWorld/Welcome?name=Scott&numtimes=4. Текст в окне: Hello Scott Num Times равно 4.

В приведенном выше примере сегмент URL ( Parameters) не используется, name а numTimes параметры передаются в виде строк запроса. Знак вопроса (вопросительный знак) в приведенном выше URL-адресе является разделителем, а строки запроса следуют. Символ & разделяет строки запроса.

Замените метод Welcome следующим кодом:

public string Welcome(string name, int ID = 1)
{
    return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID);
}

Запустите приложение и введите следующий URL-адрес: http://localhost:xxx/HelloWorld/Welcome/1?name=Scott

Снимок экрана: окно браузера с URL-адресом localhost:1234/Hello World/Welcome/1?name=Scott. Текст в окне — Hello Scott ID 1.

На этот раз третий сегмент URL-адреса соответствовал параметру маршрута Метод ID. действия содержит параметр Welcome (ID), соответствующий спецификации URL-адреса в методеRegisterRoutes.

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

В приложениях MVC ASP.NET чаще всего передавать параметры в качестве данных маршрута (как и с идентификатором выше), чем передавать их в виде строк запроса. Вы также можете добавить маршрут для передачи как параметров, name так и numtimes в качестве данных маршрута в URL-адресе. В файле App_Start\RouteConfig.cs добавьте маршрут Hello:

public class RouteConfig
{
   public static void RegisterRoutes(RouteCollection routes)
   {
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

      routes.MapRoute(
          name: "Default",
          url: "{controller}/{action}/{id}",
          defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );

      routes.MapRoute(
           name: "Hello",
           url: "{controller}/{action}/{name}/{id}"
       );
   }
}

Запустите приложение и перейдите по адресу /localhost:XXX/HelloWorld/Welcome/Scott/3.

Снимок экрана: окно браузера с U R L локальный хост двоеточие 1 2 3 4 косая черта Hello World косая черта Welcome косая черта Scott косая черта 3. Текст в окне: Привет, Скотт ID 3.

Для многих приложений MVC маршрут по умолчанию работает хорошо. Далее вы узнаете, как передать данные с помощью привязки модели, и вам не придется изменять маршрут по умолчанию для этого.

В этих примерах контроллер выполняет часть работы MVC, а именно — функции представления и контроллера. Контроллер возвращает HTML напрямую. Как правило, контроллеры не возвращают HTML напрямую, так как это становится очень громоздким для кода. Вместо этого мы обычно будем использовать отдельный файл шаблона представления для создания HTML-ответа. Давайте рассмотрим следующее, как мы можем сделать это.