Предыдущий ролик Следующий ролик  

Видео урок: Understanding controller actions

Основы ASP.NET MVC 5

В этом видео мы посмотрим, как запросы, поступающие в ваше MVC-приложение, обрабатываются действиями, которые являются методами класса контроллеров. У меня открыта Visual Studio Express 2013 for Web, и в меню Файл (File) я выберу пункт "Создать проект" (New Project), а затем в разделе "Visual C#" - "ASP.NET Web Application". В предыдущем видео я упомянул, что мы будем создавать модель банкомата, поэтому назовем наш проект "Банкомат" (Automated Teller Machine).

Я слегка увеличил размер шрифта, поэтому давайте расширим немного это окно. Начнем, конечно, с MVC-шаблона. Позднее мы поговорим о модульном тестировании и обеспечении безопасности. А пока я просто установлю флажок в поле "Создать проект для модульных тестов" (Add unit tests), чтобы избавиться от некоторых проблем, которые могут возникнуть впоследствии. Но изменять настройки аутентификации по умолчанию необязательно, поскольку мы будем настраивать индивидуальные аккаунты пользователей. В этом курсе мы не будем обсуждать Web Forms или Web API. Эти технологии рассматриваются в курсе "Работа с ASP.NET", о котором я уже упоминал.

Если вам удобно работать с курсом по MVC, то у вас не возникнет сложностей при просмотре курса по Web API, поскольку структуры курсов очень похожи. На самом деле в будущих версиях программы MVC действительно объединят с Web API. Если вы повторяете действия за мной, то уже видели Обозреватель решений (Solution Explorer). Я сделал его автоматически скрываемым. Первое, что я собираюсь сделать, прежде чем погрузиться в изучение, - обновить все пакеты NuGet, входящие в шаблон этого проекта. Нажму правой кнопкой мыши на разделе "Решение", поскольку у меня их два, и выберу пункт "Управление пакетами NuGet.." (Manage Nougat Packages for Solution). Я уже нахожусь в разделе "Обновления" (Updates). Больше всего меня интересуют EntityFramework, MVC и еще несколько пакетов, например, Bootstrap и ASP.NET Identity.

Но я просто нажму кнопку "Обновить все" (Update All), а затем кнопку "Я принимаю" (I Accept). В результате пакеты должны обновиться. Кроме того, я назначу главное приложение запускаемым проектом. Большую часть времени мы будем тратить на работу в папках: Models, Views и Controllers. Давайте сначала откроем папку Controllers. Внутри находятся два класса контроллеров C#. В ближайшее время мы поговорим о классе AccountController, но сейчас я хочу рассмотреть класс HomeController.

Так как это HomeController, по договоренности все запросы, начинающиеся с "/home/", будут обрабатываться одним из методов этого контроллера, конечно, при наличии подходящего. При создании новых контроллеров нужно убедиться, что слово "Controller" входит в название класса, поскольку это позволит нам автоматически воспользоваться преимуществами этой договоренности. Например, можно вызвать метод index, выполнив запрос Get для /home/index, или аналогично для метода about - /home/about.

Такое преобразование запроса в метод действия носит название "маршрутизация", и в следующем видео мы рассмотрим механизм, приводящий ее в действие. Давайте добавим сюда несколько точек останова, чтобы выполнить проверку. А затем я нажму клавишу F5 для запуска отладки. После запуска приложения можно увидеть, что обработка приостанавливается в методе index, но если снова нажать клавишу F5, то вы увидите, что я всего лишь запрашиваю страницу по умолчанию своего MVC-приложения.

После номера порта ничего не указано, а все потому, что действие index класса HomeController является одновременно и действием default для всего приложения. Мы скоро узнаем, где это настраивается, а пока позвольте мне показать вам, что если ввести здесь /home/index, то мы снова вернемся внутрь этого метода. Так что же делает этот метод? Итак, как видите, все методы данного класса возвращают ActionResult. ActionResult - это абстрактный класс, а наши методы действия будут возвращать объекты разных типов, которые унаследованны от этого класса. Такие методы можно некоторым образом выполнить и получить результат.

Это мог бы быть обычный неотформатированный текст, файл для загрузки, некоторые JSON-данные, которые можно обработать, или некий JavaScript, который можно выполнить. Но в нашем случае это представление. При вызове метода View без каких-либо параметров будет выполняться поиск представления, имя которого совпадает с именем этого метода. А поскольку мы находимся в классе HomeController, по умолчанию поиск будет выполняться в подкаталоге Home папки Views. Итак, если открыть файл Index.cshtml, то можно увидеть основную часть разметки, которая отражается в моем браузере при запросе действия index.

Остальная часть разметки и теги html, head и body находятся в файле layout, расположенном в подкаталоге Shared папки Views. Этот файл называется _Layout.Cshtml. В следующей главе, в которой мы будем более подробно изучать представления, мы поговорим о том, что именно здесь происходит и как эти два файла взаимодействуют друг с другом. Опять же, если запустить отладку по клавише F5, а затем ввести /home/about, то мы окажемся внутри соответствующего метода.

Давайте остановим отладку, нажав Shift+F5, и внесем некоторые изменения. Чтобы закрепить идею вызова действий вместо постоянного запроса страниц или файлов, давайте добавим еще один метод действия под названием "Foo". Если бы я прямо сейчас вызвал метод View в операторе return, то движок представлений запустил бы поиск представления под названием "Foo", которого не существует. Давайте посмотрим, что происходит. В этот раз я запущу проект без отладки по клавише Ctrl+F5 и просто введу в строке браузера /home/foo.

Получаем очень информативное сообщение об ошибке. По сути, в нем говорится следующее: "Я искал Foo повсюду и не смог его найти". Также в нем демонстрируется порядок поиска конкретных элементов. В этом курсе все наши представления будут файлами с расширением .cshtml. Но если бы я выбрал VB или C#, то вы наверняка могли бы использовать представления с расширением .vbhtml. В более ранних версиях MVC мы бы использовали файлы .aspx для представлений и файлы .ascx для частичных представлений.

Вы можете использовать эти файлы и в том случае, когда планируете работать с Web Forms, а не с представлениями Razor, о чем мы поговорим в следующей главе. Итак, вернемся к нашему контроллеру и предположим, что я не хочу создавать еще одно представление под названием "Foo", а хочу, чтобы Foo выступал в качестве альтернативного имени страницы "About". Осуществить это можно довольно легко, просто передав строку "About" в метод View. В этот раз давайте построим решение по клавише Ctrl+Shift+B и обновим страницу. Теперь мы видим страницу "About".

Итак, мы посмотрели, как базовые запросы преобразуются в действия контроллера. Мы также увидели, что метод действия может возвращать представление, которое будет отображаться в браузере. На этом этапе вас должны интересовать параметры, я имею в виду параметры строки запроса и post-параметры. О них мы поговорим в следующем видео, в котором будем более подробно обсуждать принцип работы движка маршрутизации.