ASP.NET MVC 4

ASP.NET MVC 4

Адам Фриман

Обход системы маршрутизации

Настройка свойства RouteExistingFiles, которое мы показали в предыдущем разделе, делает систему маршрутизации более содержательной. Запросы, которые обычно обходят систему маршрутизации, в настоящее время оцениваются по отношению к роутам, которые мы определили.

Противоположностью этой функции является возможность сделать систему маршрутизации менее содержательной, то есть ссылки не будут оцениваться по отношению к нашим роутам. Мы делаем это с помощью метода IgnoreRoute класса RouteCollection, как показано в листинге 13-35.

Листинг 13-35: Использование метода IgnoreRoute
public static void RegisterRoutes(RouteCollection routes) {
  routes.RouteExistingFiles = true;
  routes.IgnoreRoute("Content/{filename}.html");
  routes.MapRoute("DiskFile", "Content/StaticContent.html",
    new {
      controller = "Customer",
      action = "List",
    });
  routes.MapRoute("ChromeRoute", "{*catchall}",
    new { controller = "Home", action = "Index" },
    new {
      customConstraint = new UserAgentConstraint("Chrome")
    },
    new[] { "UrlsAndRoutes.AdditionalControllers" });
  routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
    new { controller = "Home", action = "Index",
      id = UrlParameter.Optional },
    new[] { "URLsAndRoutes.Controllers" });
}

Мы можем использовать сегментные переменные, такие как {filename}, для соответствия с рядом URL. В этом случае URL паттерн будет соответствовать любому двухсегментному URL, где первым сегментом является Content, а второй сегмент имеет расширение .html.

Метод IgnoreRoute создает запись в RouteCollection, где обработчиком роута является экземпляр класса StopRoutingHandler, а не MvcRouteHandler. Система маршрутизации очень хорошо распознает этот обработчик. Если URL паттерн, переданный методу IgnoreRoute, находит соответствие, то никакие последующие роуты не будут оцениваться, как и в случае с обычным роутом. Отсюда следует, что важно то место, где вызывается метод IgnoreRoute. Если вы запустите приложение и снова перейдете по URL /Content/StaticContent.html, вы увидите содержимое HTML файла, так как объект StopRoutingHandler обрабатывается перед любым другим роутом.

или RSS канал: Что новенького на smarly.net