Главная страница   /   9.4. Использование маршрутизации для генерации URL-адресов (ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

ASP.NET MVC 4 в действии

Джеффри Палермо

9.4. Использование маршрутизации для генерации URL-адресов

Никто не любит неработающие ссылки. И если так легко изменять маршруты URL для всего сайта, то что произойдет, если вы уже непосредственно используете эти URL в приложении (например, у вас стоят ссылки с одной страницы на другую)? Если вы измените один из маршрутов, эти ссылки перестанут работать. Решение об изменении URL дается нелегко, ведь принято считать, что если на сайте есть неработающие ссылки, то пострадает его репутация в поисковых системах. Если предположить, что у вас нет выбора, кроме как изменить маршруты, то вам нужен эффективный способ организации URL в приложениях. Всякий раз, когда нам нужен новый URL на сайте, его создает для нас платформа, и мы не кодируем его сами. Мы должны задать комбинацию из контроллера, действия и параметров, а все остальное делает метод ActionLink. ActionLink является методом расширения класса HtmlHelper, который включен в MVC Framework, и он генерирует полный HTML-тег <a> с правильным URL, который соответствует маршруту, конкретизированному параметрами переданного объекта. Вот пример вызова ActionLink:

@Html.ActionLink("MVC3 in Action", "Show", "Catalog",
	new { productCode = "mvc-in-action" }, null)

Этот пример принимает несколько параметров, и первый - это текст гиперссылки. Второй и третий указывают на действие и контроллер, к которым ведет ссылка. Четвертый принимает словарь в виде анонимного типа, который определяет любые дополнительные параметры маршрута (в данном случае, товарный код), и, наконец, дополнительные атрибуты HTML, тоже в виде анонимного типа (в данном случае мы передаем null, потому что не предоставляем никаких пользовательских атрибутов).

Используя маршруты, определенные ранее в этой главе, этот пример генерирует ссылку на действие Show в CatalogController с дополнительным параметром, указанным для productCode. Вот результат:

<a href="/products/mvc-in-action">MVC3 in Action</a>

Аналогично, если вы используете метод BeginForm HtmlHelper для создания тегов формы, он будет генерировать для вас URL. Как вы видели в предыдущем разделе, контроллер и действие могут быть не единственными параметрами для определения маршрута. Иногда для установления соответствия необходимы дополнительные параметры.

Полезно знать, как передавать в действие параметры, которые не были указаны как часть маршрута:

@Html.ActionLink("MVC3 in Action", "Show", "Catalog",
	new { productCode = "mvc-in-action", currency = "USD" }, null)

Этот пример показывает, что передача дополнительных параметров так же проста, как добавление дополнительных членов в объект, переданный ActionLink (в данном случае мы добавляем параметр, указывающий валюту). Если параметр соответствует какому-либо элементу в маршруте, он станет частью URL. В противном случае он будет добавлен в строку запроса. Например, вот ссылка, сгенерированная предыдущим кодом:

<a href="/products/mvc-in-action?currency=USD">MVC3 in Action</a>

Когда вы используете ActionLink, маршрут будет определяться по первому соответствию в коллекции маршрутов. Чаще всего этого будет достаточно, но если вы хотите запросить определенный маршрут, вы можете использовать RouteLink, который принимает параметр и по нему определяет запрошенный маршрут:

@Html.RouteLink("MVC3 in Action", "product",
	new { prouductCode = "mvc-in-action" }, null)

Этот код найдет маршрут с названием продукта, а не просто определит контроллер и действие.

Иногда необходимо получить URL, но не для ссылки или формы. Это чаще происходит, когда вы пишете код Ajax, и вам нужно установить URL запроса. Класс UrlHelper может генерировать URL напрямую; он используется методом ActionLink и другими. Вот пример:

@Url.Action("Show", "Catalog", new { productCode="mvc-in-action"})

Этот код также вернет URL /products/mvc-in-action, но без окружающих тегов.

Строго типизированные ссылки на действия

Вспомогательные методы, с которыми мы сталкивались в этом разделе, все еще полагаются на строки для указания имен контроллера и действия. Это значит, что, если мы переименуем контроллер или действие и забудем обновить вызовы к ActionLink, URL будут созданы неправильно, но мы не будем уведомлены об этом.

Существуют две основные альтернативы строкам для указания имен контроллера и действия.

Первый вариант заключается в использовании строго типизированных вспомогательных методов URL, которые доступны как часть проекта MVC Futures по адресу http://aspnet.codeplex.com. Они позволяют генерировать ссылки с помощью лямбда-выражений, таких как Html.ActionLink <HomeController> ("Home", с => c.Index ()). К сожалению, с этим подходом есть несколько проблем. Во-первых, они не будут работать правильно, если вы переименовываете методы действий с помощью атрибута ActionName. Во-вторых, использование лямбда выражений может иметь последствия для производительности, если у вас много ссылок на странице.

Другой вариант - использование T4MVC, который является частью открытого источника MvcContrib. Он генерирует код, который можно использовать для строго типизированных URL вспомогательных методов ссылок. Мы рассмотрим T4MVC в главе 13.