MVC noob - изменение части URL в ссылке - PullRequest
4 голосов
/ 09 апреля 2010

У меня есть сайт, который поддерживает локализацию. Я хотел бы иметь возможность переключаться между английским и французским языками.

Допустим, пользователь в данный момент находится по URL: http://www.mysite.com/en/Home

Я бы хотел перенаправить на: http://www.mysite.com/fr/Home

Если пользователь нажимает на французскую ссылку, как изменить часть URL-адреса на «fr», но не менять часть URL-адреса «Домашняя страница» (в основном я хочу сохранить текущее местоположение пользователя)

Надеюсь, мой вопрос имеет смысл! Я, наверное, скучаю по чему-то очень простому?

РЕДАКТИРОВАТЬ: Вид найденного решения.

<%= Html.ActionLink("Français", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { culture = "fr" }, null)%>
<%= Html.ActionLink("English", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { culture = "en" }, null)%>

Поддерживает действие / контроллер текущего URL. Может быть, есть более чистое решение?

Ответы [ 3 ]

2 голосов
/ 09 апреля 2010

В вашем Global.asax

 routes.MapRoute(
   name: "LocalizedRoute",
   url: "{language}/{controller}/{action}/{id}",
   defaults:
     new
     {
       language= "fr",
       controller = "Home",
       action = "Index",
       id = UrlParameter.Optional 
     },
   constraints: new { language= @"[a-z]{2}" });

И вы можете иметь доступ к языку с переменным языком в вашем контроллере

Чтобы создать ссылку:

<%= Html.ActionLink("French", ViewContext.RouteData.Values["action"], new { language = "fr" }) %>

И вы можете создать контроллер базового класса с этим свойством:

public string Language { get { return this.Routedata["language"]; } }
1 голос
/ 31 января 2011

Я сделал расширение для RouteValueDictionary для решения этой проблемы:

public static RouteValueDictionary SetValue(this RouteValueDictionary dictionary, string key, object value)
{
    RouteValueDictionary rvd = new RouteValueDictionary(dictionary);
    rvd[key] = value;
    return rvd;
}

Теперь вы можете использовать это следующим образом в html-шаблоне:

<div id="head">
    @Html.RouteLink("DE", ViewContext.RouteData.Values.SetValue("language", "de")) |
    @Html.RouteLink("FR", ViewContext.RouteData.Values.SetValue("language", "fr")) |
    @Html.RouteLink("IT", ViewContext.RouteData.Values.SetValue("language", "it")) |
    @Html.RouteLink("EN", ViewContext.RouteData.Values.SetValue("language", "en"))
</div>

Расширение не изменяет коллекцию RoutData.Values, оно создает копию, и вы можете переопределить желаемое значение.

0 голосов
/ 09 апреля 2010

Я бы предложил сделать URL в следующем формате:

http://www.mysite.com/Home/en

Тогда вы можете сделать такие простые действия:

<%= Html.ActionLink("Francais", "Home", "MyController", new { id = "fr" }), null %>
<%= Html.ActionLink("English", "Home", "MyController", new { id = "en" }), null %>

Тогда в вашем контроллере есть действие:

public ActionResult Home(string id)
{
    if(id == "en"){ // do something } 
    else if(id == "fr") { // do something else }
    return View();
}

Global.asax Route

routes.MapRoute(
   "HomeLanguageRoute", // Route name
   "MyController/Home/{id}", // URL with parameters
   new { controller = "MyController", action = "Home", id = "" }    // Parameter defaults
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...