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

Rick Anderson

Архитектурный паттерн Model-View-Controller (MVC) разделяет приложение на три основных компонента : Model, the View, и Controller. Паттерн MVC позволяет вам создавать приложения, которые можно легче тестировать, поддерживать и обновлять, нежели традиционные монолитные приложения. MVC приложение содержит:

  • Models: Классы, которые представляют данные приложения и используют логику валидации, чтобы приспособить бизнес-правила к данным. Обычно объекты модели извлекаются и хранят состояние в базе данных. В этой статье модель Movie извлекает соответствующие данные из базы, передает их представлению или обновляет их. Обновленные данные записываются в базу данных SQL Server.
  • Views: Это компоненты, которые отображают UI. Обычно этот UI отображает данные модели.
  • Controllers: Классы, которые обрабатывают браузерные запросы, получают модельные данные, а затем указывают шаблоны представлений, которые возвращают ответ браузеру. В MVC приложении представления только отображают информацию; контроллеры обрабатывают и отвечают на пользовательский ввод и действия. Например, контроллер обрабатывает данные маршрутизации и значения строки запросов, а затем передает эти значения модели. Модель может использовать эти значения, чтобы сделать запрос к базе данных.

Паттерн MVC помогает вам создавать приложения, в которых разделены различные аспекты приложения (логика вводимых данных, бизнес логика и UI логика), и эти элементы связаны с собой довольно гибко. В паттерне определено, где должен находиться каждый из этих видов логики. UI логика находится в представлениях. Логика ввода данных находится в контроллерах. Бизнес логика находится в моделях. Такое разделение позволяет вам работать с одним аспектом и не влиять на код другой реализации. Например, вы можете разрабатывать представление, не касаясь бизнес логики.

Мы рассмотрим все эти концепции в серии данных статей и покажем вам, как использовать их для создания простого приложения с роликами. На следующих изображениях вы увидите папки Models, Views и Controllers MVC проекта.

../../_images/mvc1.png
  • В Solution Explorer, кликните правой клавишей мышки по Controllers, а затем по Add > New Item.
../../_images/add_controller.png
  • В диалоговом окне Add New Item - Movie

    • Нажмите MVC Controller Class
    • Введите имя “HelloWorldController”
    • Нажмите Add
../../_images/new_hell_ctl.png

Замените контекст Controllers/HelloWorldController.cs следующим:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using Microsoft.Extensions.WebEncoders;

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. В примере выше оба метода возвращают string. Обратите внимание на комментарии:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
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...";
    }
}

Первый комментарий говорит о том, что это метод HTTP GET, который вызывается, если “/HelloWorld/” добавляется к URL. Второй комментарий указывает на метод HTTP GET, который вызывается, если “/HelloWorld/Welcome/” добавляется к URL. Позже мы будем использовать движок scaffold, чтобы сгенерировать методы HTTP POST.

Давайте протестируем все это с помощью браузера.

Нажмите Ctrl+F5 и добавьте “HelloWorld” в адресную строку. (На рисунке снизу используется http://localhost:1234/HelloWorld, но вам нужно будет заменить 1234 на номер порта вашего приложения.) Метод Index возвращает string. Вы указали, чтобы система вернула HTML, так и произошло!

../../_images/hell1.png

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

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

Вы настраиваете формат роутинга в файле Startup.cs.

1
2
3
4
5
6
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });

Когда вы запускаете приложение и не предоставляете никаких URL сегментов, то будет вызван контроллер “Home” и метод “Index”, указанный в строке, выделенной сверху.

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

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

../../_images/welcome.png

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

1
2
3
4
5
public string Welcome(string name, int numTimes = 1)
{
    return HtmlEncoder.Default.HtmlEncode(
        "Hello " + name + ", NumTimes is: " + numTimes);
}

Примечание

В коде сверху используется HtmlEncoder.Default.HtmlEncode для защиты приложения от злонамеренных атак (а именно JavaScript).

Примечание

В Visual Studio 2015 при запуске приложения без отладки (Ctl+F5) вам не нужно собирать приложение после изменения кода. Просто сохраняете файл, обновляете страницу в браузере, и вы увидите изменения.

Запустите приложение и перейдите к:

(Замените xxxx номером порта.) Вы можете использовать различные значения для name и numtimes в URL. Связующая модель MVC автоматически перемещает нужные параметры из строки запроса в ваш метод. См. Model Binding.

../../_images/rick4.png

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

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

1
2
3
4
5
public string Welcome(string name, int ID = 1)
{
    return HtmlEncoder.Default.HtmlEncode(
        "Hello " + name + ", ID: " + ID);
}

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

../../_images/rick_routedata.png

В этот раз третий URL сегмент соответствует параметру роута id. Метод Welcome содержит параметр id, который соответствует URL шаблону в методе MapRoute. Знак ?id?) показывает, что id параметр является не обязательным.

1
2
3
4
5
6
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });

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

Поделись хорошей новостью с друзьями!
Следи за новостями!