Url-адрес.Действие не дает ожидаемого результата. Нежелательные значения маршрута остаются

у меня есть приложение MVC3 с несколькими маршрутами. Два из них определены следующим образом:

routes.MapRoute(
  null,
  "System/{name}", // URL with parameters
  new { controller = "Systems", action = "Index" } // Parameter defaults
);
routes.MapRoute(
  null,
  "Carrier/{name}", // URL with parameters
  new { controller = "Carriers", action = "Index" } // Parameter defaults
);

теперь в моем меню у меня есть две ссылки на эти маршруты, которые создаются с помощью URL-адреса.Действие:

Url.Action("Index","Systems")
Url.Action("Index","Carriers")

теперь, когда я запускаю приложение, все кажется прекрасным, и ссылки в меню показывают как /System/ и /Carrier/, и это ожидаемое значение.

однако, когда я просматриваю, например /System/MySystem на веб-странице Я все равно хотел бы, чтобы ссылки указывали на то же самое место, но теперь они указывают на /System/MySystem и /Carrier/MySystem.

Я пробовал много вещей, чтобы ссылка не использовала имя из значения маршрута, но безрезультатно. Самый странный случай, который я испытал, был, когда я попробовал это:

Url.Action("Index","Systems", new{name = (string)null})

теперь ссылка появилась как

/System?name=MySystem

есть ли здесь хороший способ убедиться, что значение имени из значений маршрута никоим образом не мешает этим ссылкам?

1 ответов


как заметил Url. помощники повторно используют ранее заданные параметры маршрута.

в качестве обходного пути (я надеюсь, что есть более элегантное решение...) вы можете удалить name запись RouteData.Values на ваш взгляд:

Итак, прежде чем позвонить вам Url.Action на ваш взгляд:

Url.Action("Index","Systems")
Url.Action("Index","Carriers")

удалить заполненныйname С RequestContext:

@{
     Request.RequestContext.RouteData.Values.Remove("name");
}

это также временное решение, но если вы немного измените свои маршруты с предоставлением значение по умолчанию null для вашего name сегмент:

routes.MapRoute(
  null,
  "System/{name}", // URL with parameters
  new { controller = "Systems", action = "Index", name = (string)null }
);
routes.MapRoute(
  null,
  "Carrier/{name}", // URL with parameters
  new { controller = "Carriers", action = "Index", name = (string)null }
);

ваше оригинальное решение ("аннулирование"name на Url.Action) также будет работать :

@Url.Action("Index", "Systems" , new {name = (string)null} )