Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Стивен Уолтер (Stephen Walther)
Не путают с моделями, представлениями и контроллерами? В этом руководстве Стивен Уолтер знакомит вас с различными частями приложения ASP.NET MVC.
В этом руководстве представлен общий обзор ASP.NET моделей, представлений и контроллеров MVC. Другими словами, он объясняет M', V', и C' в ASP.NET MVC.
Прочитав это руководство, вы должны понять, как различные части приложения ASP.NET MVC работают вместе. Вы также должны понимать, чем архитектура приложения ASP.NET MVC отличается от ASP.NET Web Forms приложения или приложения Active Server Pages.
Пример приложения ASP.NET MVC
Шаблон Visual Studio по умолчанию для создания ASP.NET веб-приложений MVC включает очень простой пример приложения, который можно использовать для понимания различных частей приложения ASP.NET MVC. В этом руководстве мы воспользуемся преимуществами этого простого приложения.
Чтобы создать новое приложение ASP.NET MVC с помощью шаблона MVC, запустите Visual Studio 2008 и выберите в меню пункт Файл, Создать проект (см. рис. 1). В диалоговом окне Новый проект выберите предпочитаемый язык программирования в разделе Типы проектов (Visual Basic или C#) и выберите ASP.NET веб-приложение MVC в разделе Шаблоны. Нажмите кнопку "ОК".
Рис. 01. Диалоговое окно создания проекта (щелкните для просмотра полноразмерного изображения)
При создании приложения ASP.NET MVC появляется диалоговое окно Создание проекта модульного теста (см. рис. 2). Это диалоговое окно позволяет создать отдельный проект в решении для тестирования ASP.NET приложения MVC. Выберите параметр Нет, не создавать проект модульного теста и нажмите кнопку ОК .
Рис. 02. Диалоговое окно создания модульного теста (щелкните для просмотра полноразмерного изображения)
После создания нового ASP.NET приложение MVC. В окне Обозреватель решений вы увидите несколько папок и файлов. В частности, вы увидите три папки с именами "Модели", "Представления" и "Контроллеры". Как можно догадаться из имен папок, эти папки содержат файлы для реализации моделей, представлений и контроллеров.
Если развернуть папку Контроллеры, вы увидите файл с именем AccountController.vb и файл с именем HomeController.vb. Если развернуть папку Представления, вы увидите три вложенные папки с именем Account, Home и Shared. Если развернуть папку Главная, вы увидите два дополнительных файла с именами About.aspx и Index.aspx (см. рис. 3). Эти файлы составляют пример приложения, включенный в шаблон MVC по умолчанию ASP.NET.
Рис. 03. Окно Обозреватель решений (щелкните для просмотра полноразмерного изображения)
Вы можете запустить пример приложения, выбрав пункт меню Отладка, Начать отладку. Кроме того, можно нажать клавишу F5.
При первом запуске приложения ASP.NET появляется диалоговое окно на рис. 4, в которое рекомендуется включить режим отладки. Нажмите кнопку ОК, и приложение запустится.
Рис. 04. Диалоговое окно отладки не включено (щелкните для просмотра полноразмерного изображения)
При запуске приложения ASP.NET MVC Visual Studio запускает приложение в веб-браузере. Пример приложения состоит только из двух страниц: страницы Индекс и О программе. При первом запуске приложения появляется страница Индекс (см. рис. 5). Вы можете перейти на страницу О программе, щелкнув ссылку меню в правом верхнем углу приложения.
Рис. 05. Страница индекса (щелкните для просмотра полноразмерного изображения)
Обратите внимание на URL-адреса в адресной строке браузера. Например, если щелкнуть ссылку меню О программе, URL-адрес в адресной строке браузера изменится на /Home/About.
Если вы закроете окно браузера и вернетесь в Visual Studio, вы не сможете найти файл с путем Главная/О программе. Файлы не существуют. Как это происходит?
URL-адрес не равен странице
При создании традиционного приложения ASP.NET Web Forms или приложения Active Server Pages между URL-адресом и страницей существует сопоставление "один к одному". Если вы запрашиваете страницу с именем SomePage.aspx с сервера, то на диске лучше создать страницу с именем SomePage.aspx. Если файл SomePage.aspx не существует, вы получите ошибку 404 — страница не найдена .
При создании приложения ASP.NET MVC, напротив, нет соответствия между URL-адресом, введенным в адресной строке браузера, и файлами, которые вы найдете в приложении. В приложении ASP.NET MVC URL-адрес соответствует действию контроллера, а не странице на диске.
В традиционном приложении ASP.NET или ASP запросы браузера сопоставляются со страницами. В ASP.NET приложении MVC запросы браузера сопоставляются с действиями контроллера. Приложение ASP.NET Web Forms ориентировано на содержимое. Приложение ASP.NET MVC, напротив, ориентировано на логику приложения.
Основные сведения о маршрутизации ASP.NET
Запрос браузера сопоставляется с действием контроллера с помощью функции платформы ASP.NET, называемой маршрутизацией ASP.NET. ASP.NET маршрутизация используется платформой ASP.NET MVC для маршрутизации входящих запросов к действиям контроллера.
ASP.NET маршрутизация использует таблицу маршрутизации для обработки входящих запросов. Эта таблица маршрутов создается при первом запуске веб-приложения. Таблица маршрутов настраивается в файле Global.asax. Файл MVC Global.asax по умолчанию содержится в листинге 1.
Листинг 1. Global.asax
' Note: For instructions on enabling IIS6 or IIS7 classic mode,
' visit https://go.microsoft.com/?LinkId=9394802
Public Class MvcApplication
Inherits System.Web.HttpApplication
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
' MapRoute takes the following parameters, in order:
' (1) Route name
' (2) URL with parameters
' (3) Parameter defaults
routes.MapRoute( _
"Default", _
"{controller}/{action}/{id}", _
New With {.controller = "Home", .action = "Index", .id = ""} _
)
End Sub
Sub Application_Start()
RegisterRoutes(RouteTable.Routes)
End Sub
End Class
При первом запуске приложения ASP.NET вызывается метод Application_Start(). В листинге 1 этот метод вызывает метод RegisterRoutes(), а метод RegisterRoutes() создает таблицу маршрутов по умолчанию.
Таблица маршрутов по умолчанию состоит из одного маршрута. Этот маршрут по умолчанию разбивает все входящие запросы на три сегмента (сегмент URL-адреса — это любой сегмент между косой чертой). Первый сегмент сопоставляется с именем контроллера, второй сегмент сопоставляется с именем действия, а последний сегмент сопоставляется с параметром, передаваемым в действие с именем Id.
Например, рассмотрим следующий URL-адрес:
/Product/Details/3
Этот URL-адрес анализируется в три параметра, как показано ниже:
Контроллер = продукт
Action = Details
Id = 3
Маршрут по умолчанию, определенный в файле Global.asax, содержит значения по умолчанию для всех трех параметров. Контроллер по умолчанию — Home, действие по умолчанию — Индекс, а идентификатор по умолчанию — пустая строка. Учитывая эти значения по умолчанию, подумайте, как анализируется следующий URL-адрес:
/Employee
Этот URL-адрес анализируется в три параметра, как показано ниже:
Контроллер = сотрудник
Action = Index
Id =
Наконец, если вы открываете приложение ASP.NET MVC без указания URL-адреса (например, http://localhost
), то URL-адрес анализируется следующим образом:
Контроллер = home
Action = Index
Id =
Запрос направляется к действию Index() класса HomeController.
Основные сведения о контроллерах
Контроллер отвечает за управление способом взаимодействия пользователя с приложением MVC. Контроллер содержит логику управления потоком для ASP.NET приложения MVC. Контроллер определяет, какой ответ следует отправить пользователю, когда пользователь отправляет запрос в браузере.
Контроллер — это просто класс (например, класс Visual Basic или C#). Пример ASP.NET приложения MVC содержит контроллер с именем HomeController.vb, расположенный в папке Контроллеры. Содержимое файла HomeController.vb воспроизводится в листинге 2.
Листинг 2. HomeController.cs
<HandleError()> _
Public Class HomeController
Inherits System.Web.Mvc.Controller
Function Index()
ViewData("Title") = "Home Page"
ViewData("Message") = "Welcome to ASP.NET MVC!"
Return View()
End Function
Function About()
ViewData("Title") = "About Page"
Return View()
End Function
End Class
Обратите внимание, что HomeController имеет два метода с именами Index() и About(). Эти два метода соответствуют двум действиям, предоставляемым контроллером. URL-адрес /Home/Index вызывает метод HomeController.Index(), а URL-адрес /Home/About вызывает метод HomeController.About().
Любой открытый метод в контроллере предоставляется в виде действия контроллера. Вы должны быть осторожны с этим. Это означает, что любой открытый метод, содержащийся в контроллере, может вызываться любым пользователем, обладающим доступом к Интернету, введя правильный URL-адрес в браузере.
Основные сведения о представлениях
Два действия контроллера, предоставляемые классом HomeController, Index() и About(), возвращают представление. Представление содержит html-разметку и содержимое, отправляемое в браузер. Представление является эквивалентом страницы при работе с ASP.NET приложением MVC.
Необходимо создать представления в нужном расположении. Действие HomeController.Index() возвращает представление, расположенное по следующему пути:
\Views\Home\Index.aspx
Действие HomeController.About() возвращает представление, расположенное по следующему пути:
\Views\Home\About.aspx
Как правило, если вы хотите вернуть представление для действия контроллера, необходимо создать вложенную папку в папке Views с тем же именем, что и у вашего контроллера. Во вложенной папке необходимо создать ASPX-файл с тем же именем, что и у действия контроллера.
Файл в листинге 3 содержит представление About.aspx.
Листинг 3. About.aspx
<%@ Page Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<asp:Content ID="aboutContent" ContentPlaceHolderID="MainContent" runat="server">
<h2>About</h2>
<p>
Put content here.
</p>
</asp:Content>
Если пропустить первую строку в листинге 3, то большая часть представления состоит из стандартного HTML-кода. Вы можете изменить содержимое представления, введя любой нужный HTML-код.
Представление очень похоже на страницу активных серверных страниц или ASP.NET Web Forms. Представление может содержать html-содержимое и скрипты. Скрипты можно написать на любом языке программирования .NET (например, C# или Visual Basic .NET). Скрипты используются для отображения динамического содержимого, например данных базы данных.
Основные сведения о моделях
Мы обсудили контролеров и мнения. Последняя тема, которую необходимо обсудить, — это модели. Что такое модель MVC?
Модель MVC содержит всю логику приложения, которая не содержится в представлении или контроллере. Модель должна содержать всю бизнес-логику приложения, логику проверки и логику доступа к базе данных. Например, если вы используете Microsoft Entity Framework для доступа к базе данных, то следует создать классы Entity Framework (EDMX-файл) в папке Models.
Представление должно содержать только логику, связанную с формированием пользовательского интерфейса. Контроллер должен содержать только минимум логики, необходимый для возврата правильного представления или перенаправления пользователя на другое действие (управление потоком). Все остальное должно содержаться в модели.
В общем, следует стремиться к толстым моделям и тощим контроллерам. Методы контроллера должны содержать всего несколько строк кода. Если действие контроллера становится слишком жирным, следует рассмотреть возможность перемещения логики в новый класс в папке Models.
Итоги
В этом руководстве представлен общий обзор различных частей веб-приложения ASP.NET MVC. Вы узнали, как ASP.NET routing сопоставляет входящие запросы браузера с определенными действиями контроллера. Вы узнали, как контроллеры оркестрируют, как представления возвращаются в браузер. Наконец, вы узнали, как модели содержат бизнес-логику приложений, проверку и логику доступа к базе данных.