ASP.NET MVC Model-View-Controller (MVC) это архитектурный принцип, согласно которому веб-приложение делится на компоненты. Разделение веб-приложения на компоненты упрощает его разработку, тестирование и сопровождение. Платформа ASP.NET MVC представляет собой альтернативное направление для разработки веб-приложений, но в то же время не является полной заменой программированию с помощью веб-форм ASP.NET. Архитектура MVC В состав платформы MVC входят три компонента. Модель реализует логику работы для домена данных приложения. Объекты моделей получают и сохраняют состояние модели в базе данных. Представление отображает пользовательский интерфейс приложения. Пользовательский интерфейс обычно создается на основе данных модели. Контроллер осуществляет взаимодействие с пользователем, работу с моделью, а также выбор представления, отображающего пользовательский интерфейс. Контроллер обрабатывает вводимые данные и отвечает на действия пользователя. 1 Архитектура Model-View-Controller позволяет создавать приложения, в которых логика ввода, бизнес-логика и логика интерфейса разделены, но достаточно тесно взаимодействуют друг с другом. Пользовательский интерфейс располагается в представлении, логика ввода в контроллере. Бизнес-логика находится в модели. Связь между тремя основными компонентами приложения Model-View-Controller также облегчает параллельную разработку веб-приложения в команде. Например, один разработчик может создавать представление, другой логику контроллера, а третий бизнес-логику модели. Платформа ASP.NET MVC сопоставляет URL-адреса с кодом сервера способом, который несколько отличается от сопоставления страниц URL-адресов веб-форм ASP.NET. Вместо сопоставления URL-адресов со страницами или обработчиками платформа ASP.NET MVC сопоставляет их с классами контроллеров. Классы контроллера обрабатывают входящие запросы, например ввод информации пользователем и его действия, а также реализуют соответствующую логику приложений и данных на основании введенной информации. Класс контроллера обычно вызывает отдельное представление, которое генерирует веб-страницу. В платформе ASP. NET MVC компоненты модели, представления и контроллера разделены. Модель представляет бизнес-логику или логику домена приложения для работы с данными. Представление выбирается контроллером и создает соответствующий пользовательский интерфейс. При разработке приложений на платформе MVC используются обычные веб-страницы, мастер-страницы и пользовательские элементы управления. Контроллер выполняет поиск соответствующего метода действия, получает значения для использования в качестве аргументов метода, а затем обрабатывает ошибки, возникающие при выполнении метода. После этого выполняется отображение требуемого представления. По умолчанию наборы компонентов хранятся в отдельных папках проекта веб-приложения MVC. Одно из отличий платформы MVC от веб-форм состоит в том, что платформа ASP.NET MVC не использует модель обратной передачи веб-форм ASP.NET для взаимодействия с сервером. Все взаимодействия с пользователем передаются в класс контроллера. Это обеспечивает отдельное создание логики пользовательского интерфейса и бизнес-логики и, кроме того, облегчает тестирование веб-приложения. Таким образом, события состояния просмотра ASP.NET и жизненного цикла веб-страниц ASP.NET не связаны с представлениями на основе MVC. Создание приложения MVC В состав платформы ASP.NET MVC входит шаблон проекта Visual Studio, который позволяет создавать веб-приложения с соответствующей шаблону MVC структурой. Этот шаблон создает новое веб-приложение MVC, конфигурация которого предусматривает все необходимые папки, шаблоны элементов и записи файла конфигурации. Шаблоны проекта веб-приложения ASP.NET MVC основаны на шаблоне проекта веб-приложения ASP.NET. Новый проект ASP.NET MVC создается путем выбора пункта New Project (СоздатьПроект) из меню File (Файл) (рис. 1). При создании нового веб-приложения MVC Visual Studio предоставляет возможность создания двух проектов одновременно. Первый из них является вебпроектом, в котором реализуется само приложение MVC. Второй проект представляет собой проект модульного теста, в котором возможно создание модульных тестов для компонентов MVC первого проекта (рис. 2). При создании проекта веб-приложения ASP.NET MVC среда Visual Studio создает проект, в котором компоненты MVC внутри каталога проекта разделяются по специальным подкаталогам. Этот проект представляет собой готовый шаблон веб-приложения с базовой функциональностью, необходимой для стандартного вебсайта. Структура шаблона проекта веб-приложения на ASP.NET MVC 2 Web Application (Веб-приложение ASP.NET MVC 2) представлена на рис. 3. 2 Рисунок 1 Создание нового проекта Веб-приложение ASP.NET MVC 2 Рисунок 2 Окно Создание проекта модульного теста Как видно из рис. 3, в шаблоне присутствуют специфические каталоги, которых нет при создании классического проекта на ASP.NET. Единственное исключение это каталог App_Data, который является физическим хранилищем данных. Этот каталог выполняет те же функции, что и для веб-сайтов ASP.NET. 3 Рисунок 3 Структура проекта приложения MVC Остальные каталоги имеют следующее назначение. Content предназначен для вспомогательных файлов содержимого. Эта папка содержит каскадную таблицу стилей (CSS-файл) приложения. В общем случае папка Content предназначена для статических файлов Controllers предназначен для файлов контроллера. В этом каталоге расположены образцы контроллеров приложения с именами Accountcontroller и HomeController. Класс AccountController содержит реализацию входа в приложение. Класс HomeController содержит реализацию запуска приложения. Имена контроллеров в платформе MVC должны иметь суффикс Controller, например, В случае c нашей базой данных: StudentController, FacultyController или ProductController. Models предназначен для файлов модели данных, например файлов преобразования из LINQ в SQL, т. е. DBML-файлов, или файлов сущностей данных. Этот каталог обычно содержит код, который определяет объекты и логику взаимодействия с хранилищем данных. Сами объекты модели обычно располагаются в отдельных библиотеках классов. Scripts предназначен для файлов скриптов, поддерживающих приложение. Эта папка по умолчанию содержит файлы платформы ASP.NET AJAX и библиотеку jQuery. Views предназначен держит три подкаталога: для файлов страниц представления. Каталог Views со- Account здесь находятся представления, используемые в качестве пользовательского интерфейса при входе и смене пароля; Home – здесь находится представление Index, являющееся стартовой страницей приложения по умолчанию, и представление страницы About. 4 Shared предназначен для представлений, которые могут использоваться в различных контроллерах. Например, мастер-страница веб-приложения по умолчанию расположена в папке Shared. В каталоге Views в процессе разработки помещают подкаталоги для всех создаваемых контроллеров. Название подкаталога должно состоять из префикса имени контроллера. Например, если существует контроллер с именем HomeController, то в каталоге Views будет вложенный каталог с именем Ноте. При загрузке представления средой выполнения ASP.NET в подкаталоге Views\имя контроллера по умолчанию выполняется поиск файла ASPX, который имеет имя требуемого представления. Новый проект MVC, созданный средой Visual Studio, это полноценное приложение, которое можно скомпилировать и запустить без изменений. Внешний вид этого приложения в браузере показан на рис. 4. Рисунок 4 Шаблон приложения MVC в браузере Выполнение запросов в MVC Запросы к веб-приложениям ASP.NET, созданным на платформе MVC, сначала проходят через объект UrlRoutingModule, который представляет собой НТТР-модуль. Объект UrlRoutingModule анализирует запрос и выбирает маршрут. Объект UrlRoutingModule выбирает первый объект маршрута, соответствующий текущему запросу. Объект UrlRoutingModule это класс, реализующий тип RouteBase, который является базовым для всех классов, представляющих маршрут ASP.NET. В том случае, если подходящих маршрутов нет, объект UrlRoutingModule не производит никаких действий и передает запрос обратно на обычную обработку средствами ASP.NET или IIS. В выбранном объекте Route объект UrlRoutingModule получает объект, реализующий интерфейс IRouteHandler и связанный с объектом Route. Обычно в MVC-приложении это экземпляр класса MvcRouteHandler. Экземпляр MvcRouteHandler создает объект MvcHandler, реализующий интерфейс IHttpHandler. Объект MvcHandler затем выбирает контроллер, который и будет обрабатывать запрос. Классы UrlRoutingModule и MvcRouteHandler служат входными точками для платформы MVC в ASP.NET. Они отвечают за следующее: выбор нужного контроллера в веб-приложении MVC; получение отдельного экземпляра контроллера; вызов метода Execute контроллера. Рассмотрим теперь выполнение запроса более подробно. Этапы выполнения запроса в MVC наглядно представлены на рис. 5. 5 Рисунок 5 Шаблон приложения MVC в браузере Во время выполнения запроса в приложении MVC происходит следующая последовательность действий: 1) Получение первого запроса к приложению. При этом в файле Global.asax объекты Route добавляются к объекту RouteTable. 2) Выполнение маршрутизации. Модуль UrlRoutingModule использует первый подходящий объект Route В коллекции RouteTable для создания объекта RouteData. Объект RouteData далее используется для создания объекта ReguestContext. 3) Создание обработчика запроса MVC. Объект MvcRouteHandler создает экземпляр класса MvcHandler и передает этому обработчику экземпляр ReguestContext. 4) Создание контроллера. Объект MvcHandler использует экземпляр RequestContext для идентификации объекта типа IControllerFactory, в котором определены методы, требующиеся для создания контроллера Обычно это экземпляр класса DefaultControllerFactory, с помощью которого будет создан экземпляр контроллера. 5) Запуск контроллера. Экземпляр класса MvcHandler вызывает метод Execute контроллера. 6) Вызов действия. Объект типа ControllerActionInvoker (ответственный за вызов методов действия контроллера), связанный с данным контроллером, определяет, какой метод действия контроллера нужно вызвать, и вызывает его. 7) Выполнение результата. Метод действия получает введенные пользователем данные, готовит соответствующие данные ответа и выполняет результат, возвращая тип результата. Возвращаемые типы результата выполнения могут быть следующие: ViewResult; 6 RedirectToRouteResult; RedirectResult; ContentResult; JsonResult; FileResult; EmptyResult. Маршрутизация URL-адресов Платформа ASP.NET MVC использует механизм маршрутизации ASP.NET, который обеспечивает гибкость при сопоставлении URL-адресов с классами контроллера. Пользователь также может определять правила маршрутизации, которые используются платформой ASP.NET MVC для оценки входящих URL-адресов и выбора соответствующего контроллера. Пользователь также может настроить механизм маршрутизации на автоматический анализ переменных, определенных в URL-адресе, с последующей передачей значений в качестве аргументов параметра из платформы ASP.NET MVC в контроллер. Приложение MVC использует код в файле Global.asax для установки глобальных параметров маршрутизации URL-адресов по умолчанию, а также использует файл Web.config для настройки приложения. Маршруты URL-адресов инициализируются в методе Application_Start() файла Global.asax.cs. В листинге 1 показан файл Global.asax.cs, в котором с помощью метода MapRoute() класса RouteCollection реализована логика маршрутизации по умолчанию. Листинг 01. Код файла Global.asax.cs с логикой маршрутизации по умолчанию using System; using System.Collections.Generic; using System.Ling; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace College.web { public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); // Логика маршрутизации по умолчанию routes.MapRoute( "Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional } ) ; 7 } protected void Application_Start() { AreaRegistration.RegisterAllAreas() ; RegisterRoutes(RouteTable.Routes); } } Контроллеры и методы действий Платформа MVC для ASP.NET сопоставляет URL-адреса с контроллерами. Контроллеры обрабатывают входящие запросы, например, вводимые пользователями данные и их действия, а также реализуют необходимую логику работы приложения. В классе контроллера происходит вызов представления, которое генерирует HTML-разметку веб-страницы, отображающуюся в браузере. Код класса контроллера Homecontroiier, созданный по умолчанию средой Visual Studio, представлен в листинге 17.2. Листинг 17.2. Код класса контроллера Homecontroiier using System; using System.Collections.Generic; using System.Ling; using System.Web; using System. Web. Mvc; namespace College.web.Controllers { [HandleError] public class Homecontroiier : Controller { public ActionResult Index() { ViewData["Message"] = "Добро пожаловать на сайт технологического колледжа!"; return View(); } public ActionResult About() { return View(); } public ActionResult Registration() { return View(); } } } Базовый класс для всех контроллеров в MVC — это класс controllerBase, реализующий общую обработку MVC. Класс controller наследует от класса ControllerBase и является реализацией контроллера по умолчанию. Класс controller отвечает за такие этапы обработки, как: ♦ поиск метода действия, который необходимо вызвать, и проверка допустимости его вызова; ♦ получение значений, используемых как аргументы метода действия; ♦ обработка всех ошибок, которые могут возникнуть при выполнении метода действия; ♦ предоставление используемого по умолчанию класса webFormviewEngine для отображения различных типов страниц ASP.NET (представлений). 8