ASP.NET MVC

advertisement
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
Download