2009-12-17 1 views
7

У меня есть вопрос относительно RouteLink против ActionLink.Почему RouteLink генерирует дружественный URL-адрес, в то время как ActionLink этого не делает?

Рассмотрим следующий маршрут

routes.MapRoute("Routename1", 
    "{someEnum}/SpecificAction/{id}/{stringId}", 
    new { controller = "MyController", id = (int?)null, stringId= (string)null, action = "SpecificAction" }, 
    new { someEnum= "(EnumVal1|EnumVal2)" } 
); 

Странная {} someEnum часть, потому что я использую общий контроллер для всех значений перечисления, которые образуют типичный контроллер часть URL. Например,/EnumVal1/Action/и/EnumVal2/Action/используют один и тот же контроллер. Однако это не является частью проблемы.

Рассмотрим следующие два способа связывания:

<%=Html.RouteLink("Click me","Routename1", new { id = 32, stringId = "Yatzy" })%> 
<%=Html.ActionLink("Click me", "SpecificAction", "EnumVal1", new { id = 32, stringId = "Yatsy" }, null)%> 

RouteLink генерирует правильный URL, который будет/EnumVal1/SpecificAction/32/Yatzy

ActionLink генерирует URL, который выглядит как/EnumVal1/SpecificAction/32? StringId = Yatzy

Почему это? Может кто-нибудь объяснить это мне, пожалуйста.

ответ

4

RouteLinkcan only ever use the one route you specify. ActionLink будет использовать первый подходящий маршрут, независимо от того, какой из них вы планировали или нет. Ваши два примера, вероятно, соответствуют различным маршрутам.

Phil Haack's routing debugger поможет пояснить это.

+0

Hi. Это была моя первоначальная мысль, но когда я ввел данный URL в debugtool, например:/EnumVal1/SpecificAction/32/Yatzy, - он совпадает с тем же самым маршрутом, который я использую для RouteLink (это также единственный маршрут, который соответствует). – Terje

+0

Вы путаете разбор URL с генерацией ссылок. Это две разные стороны монеты. Работа с парсингами в URL-адресе не означает, что генерация ActionLink также будет соответствовать ожидаемому вами маршруту. –

+0

Ох. Как использовать отладчик маршрутизации, чтобы увидеть правую часть монеты? :) – Terje