Учебный курс по ASP.NET MVC 3, глава 4. Основы моделей, представлений и контроллеров
Это продолжение курса по разработки веб-приложений на базе фреймворка ASP.NET MVC 3, начало курса вы можете прочитать в статьях:
- Учебный курс по ASP.NET MVC 3, глава 1. Обзор ASP.NET MVC
- Учебный курс по ASP.NET MVC 3, глава 2. Структура приложения ASP.NET MVC
- Учебный курс по ASP.NET MVC 3, глава 3. Модель выполнения приложения ASP.NET MVC
В этом уроке представлена информация о моделях, представлениях и контроллерах паттерна MVC, или, другими словами, объясняется, что значат буквы M, V и C в ASP.NET MVC.
Тестовое приложение ASP . NETMVC
Стандартный шаблон проекта ASP.NET MVC в Visual Studio содержит очень простое тестовое приложение, которое можно использовать для понимания компонентов приложения ASP.NET MVC. Мы воспользуемся этим приложением.
Новое приложение ASP.NET MVC можно создать из шаблона, запустив Visual Studio и выбрав File, New Project (рисунок 1). В New Project выберите язык программирования и выберите шаблон ASP . NETMVCWebApplication в Templates. Нажмите ОК.
Рис. 1. Диалог New Project
При создании нового приложения ASP.NET MVC возникнет диалог CreateUnitTestProject (рисунок 2), с помощью которого можно создать проект для тестирования вашего проекта. Выберите No, do not create a unit test project и нажмите ОК.
Рис. 2. Диалог Create Unit Test
После этого создастся приложение. Вы увидите несколько папок и файлов в окне Solution Explorer. Если конкретнее, то вы увидите три папки, Models, Views и Controllers, из названий которых понятно, что они предназначены для файлов моделей, представлений и контроллеров.
Открыв папку Controllers, вы увидите файлы AccountController.cs и HomeController.cs. В папке Views находятся три подпапки: Account, Home и Shared. В подпапке Home находятся два файла: About.aspx и Index.aspx (рисунок 3). Эти файлы формируют тестовое приложение, включенное в шаблон ASP.NET MVC.
Рис. 3. Окно Solution Explorer
Приложение можно запустить с помощью меню DebugиStartDebugging или нажатием клавиши F5. При первом запуске приложения появится диалог (рисунок 4), в котором вам порекомендуют включить отладочный режим. Нажмите ОК и приложение запустится.
Рис. 4. Диалог Debugging Not Enabled
При запуске приложения Visual Studio запускает его в веб-браузере. Тестовое приложение состоит из двух страниц: Index и About. При первом запуске приложения появится страница Index (рисунок 5). Вы можете перейти на страницу About, нажав мышкой на ссылку в правом верхнем углу приложения.
Рис. 5. Страница Index
Обратите внимание на URL. Например, если вы нажмете на ссылке на страницу About, URL будет выглядеть как / Home / About. Если вы закроете браузер и вернетесь в Visual Studio, вы не найдете файла с путем Home/About – его не существует. Как такое возможно?
URL != страница
При создании традиционного ASP.NET Web Forms или ASP приложения будет установлена связь один-к-одному между URL и страницей. Если вы запросите страницу SomePage.aspx, будет лучше, если такая страница будет существовать на диске. Если ее не существует, вы получите ошибку 404 – Page Not Found.
И, напротив, при создании ASP.NET MVC приложения подобной связи нет. В приложении ASP.NET MVC URL связан с методом контроллера.
В традиционных приложениях ASP.NET и ASP запросы браузера связываются со страницами. В ASP.NET MVC приложении запросы связываются с методами контроллеров. Приложение ASP.NET Web Forms контентно-ориентированное, MVC – логико-ориентированное.
Понимание маршрутизации ASP . NET
Запрос браузера связывается с методом контроллера с помощью функциональности фреймворка под названием ASP.NET Routing. Эта функциональность используется фреймворком для маршрутизации входящих запросов и связывания их с соответствующими методами контроллеров. Маршрутизация использует таблицу маршрутизации, которая содержится в файле Global.asax. Стандартное содержимое этого файла приведено в листинге 1.
Листинг 1 - Global.asax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit https://go.microsoft.com/?LinkId=9394801
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);
}
}
}
При запуске приложения вызывается метод Application_Start(). В листинге 1 этот метод вызывает метод RegisterROutes(), создающий стандартную таблицу маршрутизации. Стандартная таблица маршрутизации состоит из одного маршрута, и этот маршрут разбивает все входящие запросы на три сегмента. Первый сегмент связывается с именем контроллера, второй – с его методом, и третий – с параметром, который передается в метод.
Например, URL:
/Product/Details/3
Будет разбит на:
Контроллер = Product
Метод = Details
Параметр Id = 3
Стандартный маршрут определен в файле Global.asax для всех трех параметров. Стандартный контроллер – Home, метод – Index, ID по умолчаию пустой.
Наконец, если вы запустите приложение ASP.NET MVC без поддерживаемых типов URL(https://localhost/), URL будет разбит на:
Контроллер = Home
Метод = Index
Параметр Id = пусто
Запрос будет связан с методом Index() контроллера HomeController.
Контроллеры
Контроллеры ответственны за обработку пользовательского взаимодействия и содержат бизнес-логику приложения, отвечая за то, что будет выдано пользователю при его запросе. Контроллер – это просто класс. Тестовое приложение включает контроллер HomeController.cs, содержимое которого представлено в листинге 2.
Листинг 2 - HomeController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
ViewData["Title"] = "Home Page";
ViewData["Message"] = "Welcome to ASP.NET MVC!";
return View();
}
public ActionResult About()
{
ViewData["Title"] = "About Page";
return View();
}
}
}
Обратите внимание на методы Index() и About(). Эти два метода являются методами, которые предоставляет контроллер. Url /Home/Index вызывает HomeController.Index() и URL /Home/About- соответственно About(). Каждый публичный метод контроллера воспринимается как метод контроллера, и необходимо быть внимательным относительно этого факта. Это значит, что любой публичный метод в контроллере может быть вызван кем угодно с доступом в Интернет путём ввода правильного URL в браузере.
Представления
Два метода контроллера HomeController возвращают представление. Представление содержит HTML-разметку и контент, отправляемый в браузер. Представление эквивалентно странице. Вы должны создавать представления там, где нужно. Например, действие HomeController.Index() возвратит представление по следующему пути:
\Views\Home\Index.aspx
Метод HomeController.About():
\Views\Home\About.aspx
В целом, если вы хотите возвратить представление для метода контроллера, вам нужно создать подпапку в папке Views с именем контроллера и создать в этой подпапке .aspx файл с именем метода контроллера. Листинг 3 содержит код представления About.aspx.
Листинг 3 - About . aspx
<%@ Page Language="C#" 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>
Если проигнорировать первую строчку в листинге, остальное – стандартный HTML. Представление очень похоже на страницу ASP или ASP.NET Web Forms и может иметь HTML и скрипты. Можно также писать код на вашем .NET языке программирования.
Модели
Модель содержит всю логику, относящуюся к логики валидации и доступа к данным. Например, если вы используете Microsoft Entity Framework для доступа к базе данных, вы можете создать классы EF в папке Models. Итак, представление должно содержать логику пользовательского интерфейса, контроллер – обработку, все остальное должно содержаться в модели.
В целом, вы должны стремиться к стратегии «толстых» моделей и «тонких» контроллеров. Методы контроллеров должны содержать несколько линий кода. Если метод контроллера становится слишком «толстым», нужно подумать о переносе логики в новый класс в папке Models.
Резюме
Этот урок был посвящён поверхностному описанию различных компонентов веб-приложения ASP.NET MVC. Вы узнали, как работает маршрутизация, как контроллеры генерируют представления и что такое модели.
Благодарности
Благодарим Александра Белоцерковского за неоценимую помощь в подготовке данного курса.