Общие сведения о маршрутизации в ASP.NET MVC (C#)
Стивен Уолтер (Stephen Walther)
В этом руководстве Стивен Уолтер показывает, как платформа ASP.NET MVC сопоставляет запросы браузера с действиями контроллера.
В этом руководстве вы узнаете о важной функции каждого приложения MVC ASP.NET под названием маршрутизация ASP.NET. Модуль маршрутизации ASP.NET отвечает за сопоставление входящих запросов с определенными действиями контроллера MVC. По завершении работы с этим руководством вы узнаете, как стандартная таблица маршрутов сопоставляет запросы с действиями контроллера.
Использование таблицы маршрутов по умолчанию
При создании нового приложения ASP.NET MVC приложение уже настроено для использования маршрутизации ASP.NET. ASP.NET маршрутизация настраивается в двух местах.
Во-первых, ASP.NET маршрутизация включена в файле веб-конфигурации приложения (Web.config файле). В файле конфигурации есть четыре раздела, которые относятся к маршрутизации: system.web.httpModules, system.web.httpHandlers, system.webserver.modules и system.webserver.handlers. Будьте внимательны, чтобы не удалять эти разделы, так как без них маршрутизация больше не будет работать.
Во-вторых, что еще более важно, в файле Global.asax приложения создается таблица маршрутов. Файл Global.asax — это специальный файл, содержащий обработчики событий для ASP.NET событий жизненного цикла приложения. Таблица маршрутов создается во время события запуска приложения.
Файл в листинге 1 содержит файл Global.asax по умолчанию для приложения ASP.NET MVC.
Листинг 1. Global.asax.cs
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);
}
}
}
При первом запуске приложения MVC вызывается метод Application_Start(). Этот метод, в свою очередь, вызывает метод RegisterRoutes(). Метод RegisterRoutes() создает таблицу маршрутов.
Таблица маршрутов по умолчанию содержит один маршрут (с именем Default). Маршрут по умолчанию сопоставляет первый сегмент URL-адреса с именем контроллера, второй сегмент URL-адреса с действием контроллера, а третий сегмент — с параметром с именем id.
Представьте, что вы ввели следующий URL-адрес в адресной строке веб-браузера:
/Home/Index/3
Маршрут по умолчанию сопоставляет этот URL-адрес со следующими параметрами:
controller = Home
action = index
id = 3
При запросе URL-адреса /Home/Index/3 выполняется следующий код:
HomeController.Index(3)
Маршрут по умолчанию включает значения по умолчанию для всех трех параметров. Если контроллер не указан, параметр контроллера по умолчанию имеет значение Home. Если действие не указано, параметр действия по умолчанию имеет значение Index. Наконец, если вы не укажаете идентификатор, параметр id по умолчанию будет использовать пустую строку.
Рассмотрим несколько примеров того, как маршрут по умолчанию сопоставляет URL-адреса с действиями контроллера. Представьте, что вы вводите следующий URL-адрес в адресной строке браузера:
/Дома
Так как параметр маршрута по умолчанию задан по умолчанию, ввод этого URL-адреса приведет к вызову метода Index() класса HomeController в листинге 2.
Листинг 2. HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(string id)
{
return View();
}
}
}
В листинге 2 класс HomeController включает метод с именем Index(), который принимает один параметр с именем Id. URL-адрес /Home вызывает метод Index() с пустой строкой в качестве значения параметра Id.
Из-за того, как платформа MVC вызывает действия контроллера, URL-адрес /Home также соответствует методу Index() класса HomeController в листинге 3.
Листинг 3. HomeController.cs (действие индекса без параметра)
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
Метод Index() в листинге 3 не принимает никаких параметров. URL-адрес /Home приведет к вызову этого метода Index(). URL-адрес /Home/Index/3 также вызывает этот метод (идентификатор игнорируется).
URL-адрес /Home также соответствует методу Index() класса HomeController в листинге 4.
Листинг 4. HomeController.cs (действие индекса с параметром, допускаемым значением NULL)
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(int? id)
{
return View();
}
}
}
В листинге 4 метод Index() имеет один параметр Integer. Так как параметр является параметром, допускаемым значением NULL (может иметь значение NULL), метод Index() можно вызвать без возникновения ошибки.
Наконец, вызов метода Index() в листинге 5 с URL-адресом /Home вызывает исключение, так как параметр Id не является параметром, допускающим значение NULL. При попытке вызвать метод Index() вы получите сообщение об ошибке, отображаемой на рис. 1.
Листинг 5. HomeController.cs (действие индекса с параметром Id)
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(int id)
{
return View();
}
}
}
Рис. 01. Вызов действия контроллера, которое ожидает значение параметра (щелкните для просмотра полноразмерного изображения)
URL-адрес /Home/Index/3, с другой стороны, отлично работает с действием контроллера индекса, приведенным в листинге 5. Запрос /Home/Index/3 вызывает метод Index() с параметром Id со значением 3.
Сводка
Цель этого руководства — краткое введение в ASP.NET маршрутизации. Мы изучили таблицу маршрутов по умолчанию, которую вы получаете с помощью нового приложения MVC ASP.NET. Вы узнали, как маршрут по умолчанию сопоставляет URL-адреса с действиями контроллера.