Если вы не возражаете добавить метод рядом с каждым действием в вашем контроллере, для которого вы хотите сгенерировать URL, вы можете действовать следующим образом. Это имеет некоторые недостатки по сравнению с вашим подходом к лямбда-выражению, но есть и недостатки.
Реализация: -
Добавьте это в метод Controller for EACH, для которого вы хотите создать строго типизированный URL-адрес ...
// This const is only needed if the route isn't already mapped
// by some more general purpose route (e.g. {controller}/{action}/{message}
public const string SomeMethodUrl = "/Home/SomeMethod/{message}";
// This method generates route values that match the SomeMethod method signature
// You can add default values here too
public static object SomeMethodRouteValues(MessageObject messageObject)
{
return new { controller = "Home", action = "SomeMethod",
message = messageObject };
}
Вы можете использовать их в своем коде отображения маршрута ...
Routes.MapRoute ("SomeMethod",
HomeController.SomeMethodUrl,
HomeController.SomeMethodRouteValues(null));
И вы можете использовать их ВЕЗДЕ, где вам нужно создать ссылку на это действие: -
например,
<%=Url.RouteUrl(HomeController.SomeMethodValues(new MessageObject())) %>
Если вы сделаете это таким образом ...
1) В вашем коде есть только одно место, где определены параметры для любого действия
2) Существует только один способ преобразования этих параметров в маршруты, поскольку Html.RouteLink и Url.RouteUrl могут оба принять HomeController.SomeMethodRouteValues (...) в качестве параметра.
3) Легко установить значения по умолчанию для любых дополнительных значений маршрута.
4) Рефакторинг вашего кода легко, не нарушая URL. Предположим, вам нужно добавить параметр в SomeMethod. Все, что вы делаете, это изменяете SomeMethodUrl и SomeMethodRouteValues (), чтобы они соответствовали новому списку параметров, и затем вы исправляете все сломанные ссылки в коде или в представлениях. Попробуйте сделать это с новым {action = "SomeMethod", ...} разбросанным по всему коду.
5) Вы получаете поддержку Intellisense, чтобы вы могли ВИДЕТЬ, какие параметры необходимы для создания ссылки или ссылки на какое-либо действие. С точки зрения «строгой типизации», этот подход кажется лучше, чем использование лямбда-выражений, где нет проверки времени компиляции или ошибки разработки, чтобы убедиться, что ваши параметры генерации ссылки действительны.
Недостатком является то, что вам по-прежнему необходимо синхронизировать эти методы с фактическим методом действия (но они могут быть рядом друг с другом в коде, что облегчает просмотр). Пуристы, без сомнения, будут возражать против этого подхода, но практически говорят о том, что он находит и исправляет ошибки, которые в противном случае потребовали бы тестирования, чтобы найти, и он помогает заменить строго типизированные методы Page, которые мы использовали в наших проектах WebForms.