2014-01-29 44 views
1

我正在使用多語言的ASP.NET MVC網站,我需要一些幫助,以便在部分視圖中設置主要操作中的語言。從部分視圖設置主要url的路由值

我的默認路由被聲明爲:

routes.MapRoute(
      name: "Default", 
      url: "{language}/{controller}/{action}/{id}", 
      defaults: new { language = "en", controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

在我_Layout.cshtml,我聲明瞭一個局部參考爲:

@Html.Partial("_LanguagePartial") 

這部分調用的語言控制器的操作:

@Html.Action("Index","Language") 

此控制器操作僅將已發佈的語言泵到視圖中:

public class LanguageController : BaseController 
{ 
    // 
    // GET: /Language/ 
    public PartialViewResult Index() 
    { 
     List<Language> languages = new List<Language>(); 
     foreach (Language language in Global.Data.Languages.Values) 
     { 
      if (language.IsReleased) 
       languages.Add(language); 
     } 
     return PartialView(languages); 
    } 

    public ActionResult SelectLanguage(string code) 
    { 
     //I tried to change the route value here, but this only affects the route to this action 
     var routeDataDict = HttpContext.Request.RequestContext.RouteData.Values; 
     routeDataDict["language"] = code; 
     return RedirectToRoute(routeDataDict); 
    } 
} 

是在部分所示的實際來看,是這樣的:

<div class="float-center"> 
<table><tr> 
@foreach (var language in Model) { 
    <td> 
    <a href="@Url.Action("SelectLanguage", new { code = language.CultureCode })"> 
     <!--The css for the correct sprite is generated by language.Icon.ToString() 
      The result will look like "background: url("/Images/Icons.png") -0px -100px; display: block; width: 32px; height: 20px; text-indent: -9999px;"--> 
     <img alt="" src="" style="@Url.Content(@language.Icon.ToString());border=1" /> 
    </a> 
    </td> 
} 
</tr></table> 

現在這部分呈現在網站的每個網頁,像它應該,但是當我例如在mydomain/en/SomeController/SomeAction上,我點擊讓我們說德國圖標,它應該帶我到mydomain/de/SomeController/SomeAction。

當然,動作和控制器不固定。

關於如何執行此操作的任何想法? 也許我已經實現了部分錯誤,如果我以不同的方式實現它,我將能夠訪問該路線。

編輯: 隨着meilke的答案的幫助下,我做了以下編輯到語言控制器:

public ActionResult SelectLanguage(string code) 
    { 
     string url = ReplaceLanguageCode(Request.UrlReferrer.ToString(), code); 
     return Redirect(url); 
    } 

    private string ReplaceLanguageCode(string url, string code) 
    { 
     Language language = GetLanguage(url); 
     if (language == null) 
     { 
      //No Language is set in the url e.g. http://mydomain/ 
      string domain = Request.Url.AbsoluteUri.ToString().Replace(Request.Url.PathAndQuery, ""); 
      return url.Replace(domain, domain + "/" + code); 
     } 
     else 
      //A Language was already set in the url e.g. http://mydomain/en/ 
      return url.Replace("/" + language.CultureCode + "/", "/" + code + "/"); 
    } 

    private Language GetLanguage(string url) 
    { 
     //Loop the apps languages to see if one is set in the url 
     foreach (Language language in Global.Data.Languages.Values) 
     { 
      if (url.ToLower().Contains("/" + language.CultureCode + "/")) 
       return language; 
     } 
     return null; 
    } 

的SetLanguage動作更改爲使用UrlReferrer由meilke的回答說。我還添加了ReplaceLanguageCode來創建新的url,並且GetLanguage獲取語言,如果原始url包含一個。

回答

1

擁有一個通用控制器,不管當前動作或當前控制器如何,並將SelectLanguage放置在那裏。然後利用Request.UrlReferrermore information),讓你回到你來的(現在用正確的語言),其中:

public ActionResult SelectLanguage(string code) 
{ 
    // set language here 

    return Redirect(Request.UrlReferrer.ToString());  
} 
+0

你是什麼意思與通用控制器?一個自定義控制器,我的所有其他控制器派生自? – FoxHound

+0

我在想一些中央控制器,但你仍然可以使用'LanguageController'。這個想法是有一個鉤子,您可以在其中設置新語言(cookie?)並重定向回(無需指定「Request.UrlReferrer」知道的背後是什麼)。 – meilke

+0

謝謝,與UrlReferrer我實際上可以得到主要的網址,我可以只取代語言代碼,並做一個重定向。我將編輯我的原始問題以顯示現在如何完成以供將來參考 – FoxHound