Учебный курс по ASP.NET MVC 3, глава 2. Структура приложения ASP.NET MVC

Это продолжение курса по разработки веб-приложений на базе фреймворка ASP.NET MVC 3, начало курса вы можете прочитать в статье Учебный курс по ASP.NET MVC 3, глава 1. Обзор ASP.NET MVC.

Фреймворк MVC и структура приложения

URL-ы обычно связываются с файлами, хранящимися на диске (обычно .aspx). Эти файлы включают разметку и код, который обрабатывается при запросе. Фреймворк MVC связывается URL-ы с серверным кодом иным образом, нежели Web Forms. Вместо связывания их со страницами или обработчиками ASP.NET, фреймворк связывает их с классами контроллеров. Классы контроллеров обрабатывают входящие запросы, такие как ввод информации и другое взаимодействие с пользователем, и выполняет подходящее приложение и логику основываясь на вводе пользователя. Класс контроллера обычно генерирует отдельное представление.

Фреймворк MVC разделяет компоненты модели, представления и контроллера. Модель представляет из себя бизнес или доменную логику приложения, обычно основанную на данных из базы данных. Представление выбирается контроллером. По умолчанию для генерации в браузере фреймворк использует существующие страницы .aspx, master page и пользовательские контролы .ascx. Контроллер определяет подходящий метод-действие контроллера, собирает значения и использует их в качестве аргументов для этих методов, и обрабатывает все ошибки, которые могут возникнуть, генерируя затем запрошенное представление. По умолчанию, файлы всех компонентов распределены по отдельным папкам в иерархии приложения MVC.

URL маршрутизация

Фреймворк ASP.NET MVC использует движок маршрутизации ASP.NET, предоставляющий гибкий механизм для связывания URL-ов с классами контроллеров. Вы можете определить собственные правила маршрутизации или использовать движок маршрутизации для автоматического распознавания переменных в URL, и предоставить возможность фреймворку самому обрабатывать маршруты. Подробнее см. ASP.NET Routing.

Фреймворк MVC и Postbacks

Фреймворк ASP.NET MVC не использует для взаимодействия с сервером postback-модель из Web Forms. Вместо этого, все взаимодействие с пользователем маршрутизируется на определенный класс контроллера. Это обеспечивает разделение между логикой пользовательского интерфейса и бизнес-логикой и помогает возможности эффективно тестировать приложение. Как итог, состояние представления ASP.NET и жизненный цикл страницы Web Forms несовместимы с MVC-based представлениями.

Шаблон проекта MVC

Фреймворк ASP.NET MVC имеет шаблон в Visual Studio, структурированный согласно паттерну MVC. Шаблон создаёт новое приложение, сконфигурированное с учетом необходимых папок, шаблонов компонентов и конфигурационных файлов.

Шаблон ASP.NET MVC Web Application основан на шаблоне ASP.NET Web Application. Новый MVC-проект можно создать с помощью New Project в меню File вместо выбора New Web Site.

При создании нового приложения MVC Web Visual Studio предоставляет возможность создания двух проектов, первый из которых – веб-проект, где реализуется ваше приложение, и второй – проект для тестирования, где можно писать юнит-тесты для компонентов первого проекта.

Microsoft Visual Studio Standard Edition и Microsoft Visual Web Developer Express Edition не поддерживают создание проектов-тестов и не предлагают их создание при создании приложения MVC.

Можно использовать любой фреймворк для тестирования, совместимый с .NET Framework. Visual Studio Professional Edition включает поддержку MSTest. Подробнее см.MSTest.exe Command-Line Options.

Структура проекта Web Application MVC Project

При создании проекта ASP.NET MVC Web application компоненты MVC будут разделены согласно иерархии MVC (иллюстрация):

clip_image00164

По умолчанию MVC проект состоит из следующих папок:

  • App_Data, хранилище для данных, имеет то же значение, что и в веб-сайте ASP.NET с использованием Web Forms.
  • Content, рекомендуемое хранилище для файлов контента, таких, как файлы CSS, изображения и др. В целом, эта папка для хранения статичных файлов.
  • Controllers, рекомендуемое хранилище для контроллеров. Фреймворку MVC необходимо, чтобы имена всех контроллеров заканчивались на “Controller”, например, HomeController.
  • Models, хранилище для классов, отображающих модель данных приложения. Обычно в этой папке хранится код, определяющий объекты и логику взаимодействия с хранилищем данных. Обычно, объекты моделей хранятся в отдельных библиотеках классов, однако, когда вы создаете новое приложение, вы можете поместить сюда классы и затем переместить их в отдельные библиотеки классов.
  • Scripts, рекомендуемое хранилище для файлов скриптов, по умолчанию содержит скрипты для ASP.NET AJAX и Jquery.
  • Views, рекомендуемое хранилище для представлений. Представления используют ViewPage (.aspx), ViewUserControl(.asx), ViewMasterPage(.master), и другие файлы, относяющиеся к генерации представлений. Данная папка хранит подпапки для каждого контроллера. Например, если у вас есть контроллер HomeController, в папке View будет подпапка Home. По умолчанию при загрузке представления фреймворк ищет файл ViewPage (.aspx) с запрашиваемым именем в папке Views\controllerName. Также по умолчанию здесь есть папка Shared, которая не относится к контроллерам и используется для представлений, которые используются многими контроллерами, допустим, вы можете поместить сюда master page для всего приложения.

Кроме этих папок, приложение использует код в файле Global.asax для установки маршрутов и файл Web.config для конфигурирования приложения..

Умолчания, связанные с глобальной маршрутизацией URL-ов

Маршруты устанавливаются в методе Application_Start в файле Global.asax. Следующий пример иллюстрирует типичный файл Global.asax с логикой маршрутизации.

public class MvcApplication : System.Web.HttpApplication { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); } }

Благодарности

Благодарим Александра Белоцерковского за неоценимую помощь в подготовке данного курса.