我正在使用多語言的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包含一個。
你是什麼意思與通用控制器?一個自定義控制器,我的所有其他控制器派生自? – FoxHound
我在想一些中央控制器,但你仍然可以使用'LanguageController'。這個想法是有一個鉤子,您可以在其中設置新語言(cookie?)並重定向回(無需指定「Request.UrlReferrer」知道的背後是什麼)。 – meilke
謝謝,與UrlReferrer我實際上可以得到主要的網址,我可以只取代語言代碼,並做一個重定向。我將編輯我的原始問題以顯示現在如何完成以供將來參考 – FoxHound