2014-02-21 8 views
2

У меня есть веб-приложение на основе ASP.NET MVC4, в котором я использую макет, который содержит три языковых флага (изображения). Эти флаги видны на всем сайте. Теперь я хочу использовать эти изображения для выбора языка. Чтобы показать любую из страниц на определенном языке, мне просто нужно добавить параметр к текущему URL-адресу и загрузить его, затем мои контроллеры оценивают его и устанавливают правильный язык в модели (или устанавливают исходный резервный язык, когда есть в запросе не указан язык).Как добавить параметр к текущему URL-адресу в представлении?

Вот пример (hxxp = HTTP):

Ни один язык не указано:

hxxp://mysite.com?StationId=12 

Язык указано:

hxxp://mysite.com?StationId=12&lang=1033 

Мой вопрос: как я могу сформировать ссылку на мой макет, который окружает изображение флага языка и всегда указывает на текущий загруженный URL со всеми параметрами PLUS новый параметр &lang=1033 соответственно ?lang=1033 в случае, если есть только параметр языка?

Другими словами: как создать ссылку на ту же страницу со всеми параметрами и просто добавить значение маршрута в URL?

Update: Вот подробный пример

В моем _Layout.cshtml у меня есть:

@{ 
var u_eng = new RouteValueDictionary(Url.RequestContext.RouteData.Values); 
var u_deu = new RouteValueDictionary(Url.RequestContext.RouteData.Values); 
var u_por = new RouteValueDictionary(Url.RequestContext.RouteData.Values); 
u_eng.Add("lang", "1033"); 
u_deu.Add("lang", "1031"); 
u_por.Add("lang", "1046"); 
} 
. 
. 
. 
<li> 
    <a href="@Url.RouteUrl(u_por)" class="Flag BR">BR</a> 
</li> 
<li> 
    <a href="@Url.RouteUrl(u_eng)" class="Flag US">US</a> 
</li> 
<li> 
    <a href="@Url.RouteUrl(u_deu)" class="Flag DE">DE</a> 
</li> 

Теперь, когда я запускаю сайт, ссылки на начальную страницу работы просто отлично, они указывают на ток страницы и добавьте параметр lang = xy в соответствующий URL-адрес.

Но когда я иду на другую страницу, которая использует тот же файл макета, а также использует параметр, ссылки не получают построить правильно: пусть я иду в субстранице, который определяется этим URL:

http://localhost:1234/Stations?position=up 

Сама страница отображается правильно. Но когда я зависать или следовать языковые ссылки, они указывают на:

http://localhost:1234/Stations?lang=1031 вместо

http://localhost:1234/Stations?position=up&lang=1031

Как вы можете видеть, все существующие параметры опущены.

ответ

6

Вы можете использовать текущую коллекцию значений маршрута, добавить к ней новое значение, а затем создать URL-адрес с помощью URL-адреса помощника RouteUrl. Для сбора параметров строки запроса, передаваемые на страницу, которую можно итерацию Повсеместно в HttpContext.Request.QueryString словаре:

@{ 
    var currentRouteValues = new RouteValueDictionary(Url.RequestContext.RouteData.Values); 
    var queryString = Request.QueryString; 
    foreach (var key in queryString.AllKeys) 
    { 
     currentRouteValues.Add(key, queryString[key]); 
    } 

    currentRouteValues.Add("lang", "1033"); 
} 

Затем использовать его как это:

@Url.RouteUrl(currentRouteValues) 
+0

Это именно то, что я искал. Благодаря! – Robert

+0

К сожалению, это не сработало, как ожидалось: я построил код сверху в свой файл макета, где я использую @Url.RouteUrl (currentRouteValues) как href в теге «a», но кажется, что он только получает сборку один раз, а затем не «распознает» любые существующие значения маршрута на любых подстраницах, устанавливается только параметр «lang». – Robert

+1

@Robert, не могли бы вы выставить код? Я не уверен, что понимаю проблему. – Andrei