Главная страница   /   13.9. Обход системы маршрутизации (ASP.NET MVC 4

ASP.NET MVC 4

ASP.NET MVC 4

Адам Фриман

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

Настройка свойства 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 обрабатывается перед любым другим роутом.