У вас не может быть двух параметров сегмента с одинаковым именем
Таким образом, если вы скажете ViewContext.RouteData.Values["culture"]
, вы получите правильное значение культуры, связанное с конкретным сегментом, либо первым, либо вторым, в зависимости от определения URL вашего маршрута, которое может выглядеть следующим образом:
{culture}/{controller}/{action}/{lang}/{id}/{filter}
Как видите, есть только один параметр сегмента с именем culture
.
Примечание : определение URL верхнего маршрута может не совпадать с вашим, но в нем показан пример, который может работать с URL вашего запроса.
Получить определение URL текущего маршрута
Но в противном случае вы можете получить текущее определение URL-адреса маршрута, чтобы найти правильный сегмент:
((Route)ViewContext.RouteData.Route).Url
Преобразование RouteBase
в Route
, вероятно, будет работать в 99% случаев, потому что использование пользовательских классов маршрутов не является распространенным явлением, но даже если пользовательские классы с большей вероятностью наследуют от Route
, чем RouteBase
.
Анализ этого определения URL может быть более сложной задачей в зависимости от сложности определений вашего маршрута. Но вы можете более или менее успешно сопоставить любое определение URL с сегментами URL запроса. И это может быть именно то, что вы после.
Пусть текущий маршрут заменит вас
Но вместо того, чтобы разбирать URL-адрес маршрута и заменять правильный сегмент, вы можете позволить самому маршруту сделать это за вас просто:
((Route)ViewContext.RouteData.Route)
.GetVirtualPath(
ViewContext.RequestContext,
new RouteValueDictionary(new { culture = "en-GB" }))
.VirtualPath