Даже в наше время RESTful URL адреса, которые имеют расширение .html всё ещё достаточно популярны. Рассмотрим, как сформировать подобные URL-адреса для ASP.NET MVC.
За формирование URL адреса в ASP.NET MVC отвечает маршрутизация. Именно с её помощью производится сопоставление между собственно адресом и действиями того или иного контроллера.
По умолчанию в ASP.NET MVC настроен только один единственный маршрут.
1 2 3 4 |
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index",id = UrlParameter.Optional }); |
Данный маршрут полностью соответствует RESTful, но не содержит нужного нам окончания. Только, если мы просто добавим его в текст шаблона, web приложение сразу же перестанет работать.
Дело в том, что в файле Web.config по умолчанию не подключен обработчик, который позволяет корректно обрабатывать адреса оканчивающиеся .html. Кроме того, даже основные варианты адресов в подобной ситуации невозможно описать в одном шаблоне, а следовательно и реализовать в одном маршруте. Но, об этом позже.
В начале подключим нужный обработчик в файле Web.config, как показано ниже.
1 2 3 4 5 6 7 8 9 |
<system.webServer> … <handlers> … <add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> ... </handlers> … </system.webServer> |
Теперь мы можем смело добавить окончание .html к исходному маршруту и он будет работать.
1 2 3 4 |
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}.html", defaults: new { controller = "Home", action = "Index",id = UrlParameter.Optional }); |
Но, в процессе работы нас ждёт разочарование. Работоспособными являются только адреса вида:
1 |
https://example.com/Home/Index/123.html |
Адрес без указания параметра id такой маршрут превращает в некорректный:
1 |
https://example.com/Home/.html |
А, обращение к главной странице web приложения по доменному имени и вовсе недоступно.
Как выйти из положения?
По сути, ответ на этот вопрос был дан в самом начале. Маршрутизацию для web приложения при использовании окончания .html в URL адресах невозможно реализовать в рамках одного шаблона. Следовательно, требуется создать дополнительные маршруты.
Первый маршрут имеет шаблон URL адреса в виде пустой строки. Тем самым решается проблема доступа к главной странице. Во втором маршруте из шаблона полностью исключается параметр id.
В результате маршрутизация в web приложении задаётся тремя маршрутами следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "", defaults: new { controller = "Home", action = "Index"); routes.MapRoute( name: "Html1", url: "{controller}/{action}.html", defaults: new { controller = "Home", action = "Index"); routes.MapRoute( name: "Html2", url: "{controller}/{action}/{id}.html", defaults: new { controller = "Home", action = "Index",id = UrlParameter.Optional }); } } |
Теперь приложение полностью работоспособно.
Добавить комментарий