Asp.net mvc 3 - получить параметр по имени - PullRequest
1 голос
/ 26 ноября 2011

URL есть

http://mysite.com/en-us/articles/browse/en-us/12/byCategory

Известно, что один из этих параметров назван culture. Конечно, я могу позвонить ViewContext.RouteData.Values["culture"], чтобы получить значение из culture, но мне не сказано, какой en-us параметр (первый или второй) назван culture.

Моя задача - распознать, какой из параметров с именем culture, заменить его указанным значением и вернуть новый URL. Как это сделать?

1 Ответ

3 голосов
/ 26 ноября 2011

У вас не может быть двух параметров сегмента с одинаковым именем

Таким образом, если вы скажете 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
...