Поделиться через


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

Рик Андерсон

Примечание

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

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

  • проще для выполнения;
  • охватывает дополнительные возможности;
  • Предпочтительный подход к разработке новых приложений.

MVC расшифровывается как model-view-controller. MVC — это шаблон для разработки хорошо спроектированных, тестируемых и простых в обслуживании приложений. Приложения на основе MVC содержат:

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

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

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

Снимок экрана: окно Обозреватель решений. Откроется меню Контроллеры правой кнопкой мыши и подменю Добавить.

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

Снимок экрана: диалоговое окно

Присвойте новому контроллеру имя HelloWorldController и нажмите кнопку Добавить.

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

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

Снимок экрана, на котором показана открытая вкладка Hello World Controller c s. В Обозреватель решений вложенная папка Hello World Controller cs и вложенная папка Hello World обведена красным цветом.

Замените содержимое файла на код, приведенный ниже.

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-адресов, по умолчанию используется контроллер "Home" и метод действия "Индекс", указанный в разделе по умолчанию приведенного выше кода.

Первая часть URL-адреса определяет класс контроллера для выполнения. Поэтому /HelloWorld сопоставляется с классом HelloWorldController . Вторая часть URL-адреса определяет метод действия в классе для выполнения. Поэтому /HelloWorld/Index приведет к выполнению IndexHelloWorldController метода класса . Обратите внимание, что нам нужно было перейти только к /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-адресе. Система привязки модели ASP.NET MVC автоматически сопоставляет именованные параметры из строки запроса в адресной строке с параметрами в методе .

Снимок экрана, на котором показано окно браузера с двоеточием локального узла U R L 1 2 3 4 косой черты Hello World прямая косая черта Приветственное имя вопроса равно Scott, а num times — 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

Снимок экрана, на котором показано окно браузера с двоеточием локального узла U R L 1 2 3 4 косой черты Hello World прямая косая черта Приветствие прямой косой черты 1 вопросительный знак имя равно 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 }
    );
}

В ASP.NET приложениях MVC более типично передавать параметры в виде данных маршрута (как это было с идентификатором выше), чем передавать их в виде строк запроса. Можно также добавить маршрут для передачи 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 косой черты Приветствие прямой косой черты Scott косая черта 3. Текст в окне — Hello Scott ID 3.

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

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