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

Rick Anderson

Архитектурный паттерн Model-View-Controller (MVC) делит приложение на три основных компонента : Model, 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... > MVC Controller Class
../../_images/add_controller.png
  • В диалоговом окне Add New Item введите HelloWorldController.

Замените код 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 GET, который вызывается путем присоединения “/HelloWorld/” основному URL. Второй комментарий указывает на метод HTTP GET,который вызывается путем присоединения “/HelloWorld/Welcome/” URL. Далее мы будем генерировать методы HTTP POST.

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

../../_images/hell1.png

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

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

Формат для роутинга настраивается в файле Startup.cs.

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 сегмента ( id) касается роутовых данных. Далее мы рассмотрим роутовые данные.

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

../../_images/welcome.png

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

public string Welcome(string name, int numTimes = 1)
{
    return HtmlEncoder.Default.Encode($"Hello {name}, numTimes: {numTimes}");
}

Примечание

В коде выше используется HtmlEncoder.Default.Encode, чтобы защитить приложение от злоумышленного ввода (а именно, JavaScript). Также здесь используются интерполяционные строки.

Примечание

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

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

http://localhost:xxxx/HelloWorld/Welcome?name=Rick&numtimes=4

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

../../_images/rick4.png

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

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

public string Welcome(string name, int ID = 1)
{
    return HtmlEncoder.Default.Encode($"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 является дополнительным.

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

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

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