Вопрос

На ASP.NET MVC (бета) сайте, который я разрабатываю, иногда вызовы ActionLink возвращают мне URL-адреса, содержащие строки запроса. Я выделил обстоятельства, которые вызывают такое поведение, но я до сих пор не понимаю, почему вместо создания чистого URL-адреса он решает использовать параметр строки запроса. Я знаю, что функционально они одинаковы, но для согласованности (и внешнего вида) URL-адресов это не то, что я хочу.

Вот мои маршруты:

routes.MapRoute(
    "Photo Gallery Shortcut",
    "group/{groupname}",
    new { controller = "Photos", action = "All", Id = "" });

routes.MapRoute(
    "Tagged Photos", //since the Tagged action takes an extra parameter, put it first
    "group/{groupname}/Photos/Tagged/{tagname}/{sortby}",
    new { controller = "Photos", action = "Tagged", Id = "", SortBy = "" });

routes.MapRoute(
    "Photo Gallery", //since the Gallery's defualt action is "All" not "Index" its listed seperatly
    "group/{groupname}/Photos/{action}/{sortby}",
    new { controller = "Photos", action = "All", Id = "", SortBy = "" });

routes.MapRoute(
    "Group",  //<-- "Group" Category defined above
    "group/{groupname}/{controller}/{action}/{id}",
    new {controller = "Photos", action = "Index", Id = ""});

Теперь проблема возникает только тогда, когда я смотрю на вид, описанный маршрутом с именем " Фотографии с тегами " и выполнить ActionLink через:

Html.ActionLink<PhotosController>(p => p.All((string)ViewData["group"], ""), "Home")

Который производит URL:

http://domain/group/GROUPNAME?sortBy=

Из любого другого вида, полученный URL-адрес:

http://domain/group/GROUPNAME

Я вытащил Фила Отладчик маршрутизации ASP.NET , и все появляется в порядке. Это меня поставило в тупик. Есть идеи?

Это было полезно?

Решение

Не уверен, почему разные представления производят разные URL.

Но вы можете избавиться от этого параметра sortBy, назначив значение по умолчанию для первого маршрута.

new {sortBy = " " }

Во время генерации, если sortBy соответствует значению по умолчанию, механизм маршрутизации пропустит этот параметр (если он находится в строке запроса).

Другие советы

Здесь вам придется использовать именованные маршруты, а не маршруты действий, потому что маршрутизация работает в ASP.NET, потому что она «первое соответствие», а не «наилучшее соответствие».

Я думаю, что это ваш первый маршрут. У этого тоже есть действие Все. И поскольку sortby не указан, он представляет его как параметр строки запроса

Это все равно будет работать с методом действия 'All' в PhotosController, поскольку он просто заполняет параметр sortby значением строки запроса.

В отладчике маршрута он выполняет 3-й маршрут или 1-й?

scroll top