Определение маршрутов. Работа с маршрутами.
Установкой маршрутов занимается статический метод RegisterRoutes. Вызывается этот метод файле Global.asax в методе Application_Start:
protected void Application_Start()
{
RouteConfig.RegisterRoutes(RouteTable.Routes);
…
}
Все определения маршрутов находятся в файле RouteConfig.cs
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
Далее идет собственно определение маршрута по умолчанию. Метод routes.MapRoute выполняет сопоставление маршрута запросу. В перегруженных версиях данного метода мы можем задать дополнительные параметры сопоставления.
Разберем параметры метода. Вначале с помощью свойства name задается имя маршрута - Default. Второй параметр - url задает шаблон строки запроса или шаблон Url, с которым будет сопоставляться данный маршрут.
Шаблон URL включает в себя несколько сегментов, которые заключены в фигурные скобки. В данном случае сегмент представляет часть запроса, которая находится между слешами. Каждый такой сегмент шаблона содержит параметр. Эти параметры называются параметрами URL. В данном случае это параметры controller, action и id. Но вообще параметры могут иметь различные имена, включающие любые алфавитно-цифровые символы.
Третий параметр метода routes.MapRoute - defaults определяет значения по умолчанию для маршрута.
defaults: new { controller = "Book", action = "Show", id = UrlParameter.Optional }
Последний параметр объявлен как необязательный id = UrlParameter.Optional, поэтому, если он не указан в строке запроса, он не будет учитываться
Генерация исходящих адресов URL.
Наиболее простой способ вывода адреса является использование анкора - элемента a:
<a href="Home/Index/3" /> |
Но также мы можем использовать специальные хелперы рендеринга - Html.ActionLink и Html.RouteLink
Html.ActionLink
Хелпер ActionLink создает гиперссылку на действие контроллера. Если мы создаем ссылку на действие, определенное в том же контроллере, то можем просто указать имя действия:
@Html.ActionLink("Жми здесь", "Имя_Метода",”Имя_контроллера”)
Что создаст вам следующую разметку:
<a href="/ Имя_контроллера / Имя_Метода ">Жми здесь</a>
Html.RouteLink
Хелпер RouteLink использует похожий шаблон, что и ActionLink: он принимает имя маршрута, но не требует аргументов для имени контроллера и имени действия. Так, первый пример с ActionLink эквивалентен следующему коду:
@Html.RouteLink("Все книги", new { controller = "Book", action = "Index", author = "Толстой", id = 10 }, new { id = "Tolstoi", @class = "link" })
Чтобы использовать маршрут, нам просто надо указать имя определенного нами маршрута и затем определить при необходимости дополнительные параметры. Например, возьмем стандартный маршрут Default:
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id=RouteParameter.Optional } }
);
Создание собственного обработчика маршрутов.
Процесс маршрутизации состоит из следующих этапов:
Модуль UrlRoutingModule пытается сопоставить текущий запрос с маршрутами в таблице RouteTable.
Если сопоставление завершилось удачно, то модуль маршрутизации выбирает обработчик маршрутов сопоставленного маршрута - объект IRouteHandler.
Затем у объекта IRouteHandler вызывается метод GetHandler, который возвращает объект IHttpHandler, используемый для обработки запроса.
У обработчика IHttpHandler вызывается метод ProcessRequest для обработки запросов.
Пример:
Итак, сначала создадим сам обработчик.
using System.Web;
using System.Web.Routing;
namespace Routing.RouteHandlers
{
public class MyRouteHandler : IRouteHandler
{
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
return new MyHttpHandler();
}
}
public class MyHttpHandler : IHttpHandler
{
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
context.Response.Write("Инопланетное послание : Привет мир!");
}
}
}
Теперь в классе RouteConfig пропишем маршрут, который будет обрабатываться нашим обработчиком, не забывая при этом импортировать пространство имен, в котором объявлен наш обработчик:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
Route newRoute = new Route("{controller}/{action}", new MyRouteHandler());
routes.Add(newRoute);
}
}