我有一个本地化的MVC应用程序。直到我将Areas添加到我的应用程序中,这一直很好。我一直在使用此语言切换器在可用语言之间进行切换。
这里是HTML代码:
<div class="dropdown-menu dropdown-menu-fit dropdown-menu-right dropdown-menu-anim dropdown-menu-top-unround">
<ul id="mLangSel" class="kt-nav kt-margin-t-10 kt-margin-b-10">
<li id="mLangEn" class="kt-nav__item ">
<a href="@Url.Action("SwitchUICulture","Home",new {lang="en" })" class="kt-nav__link">
<span class="kt-nav__link-icon"><img class="rounded-circle" data-offset="10px,0px" src="~/assets/media/flags/012-uk.svg" alt="" /></span>
<span class="kt-nav__link-text" style="margin-left:10px">@Menus.MENU_LANG_ENGLISH</span>
</a>
</li>
<li id="mLangIs" class="kt-nav__item">
<a href="@Url.Action("SwitchUICulture","Home",new {lang="is-IS" })" class="kt-nav__link">
<span class="kt-nav__link-icon"><img class="rounded-circle" style="width:30px;height:auto;" src="~/assets/media/flags/is_iceland.svg" alt="" /></span>
<span class="kt-nav__link-text" style="margin-left:10px">@Menus.MENU_LANG_ICELANDIC</span>
</a>
</li>
</ul>
</div>
这是Controller方法:
public ActionResult SwitchUICulture(string lang)
{
//TODO: Add update to UILang claim for user on every change
if (!string.IsNullOrEmpty(lang))
{
Session["Culture"] = new CultureInfo(lang);
}
return Redirect(Request.UrlReferrer.ToString()); // RedirectToAction("Index");
}
我的Global.cs文件中也有此方法
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
if (HttpContext.Current.Session != null)
{
CultureInfo ci = (CultureInfo)this.Session["Culture"];
if (ci == null)
{
string langName = "en";
//Try to get values from Accept lang HTTP header
//if (HttpContext.Current.Request.UserLanguages != null && HttpContext.Current.Request.UserLanguages.Length != 0)
//{
// langName = HttpContext.Current.Request.UserLanguages[0].Substring(0, 2);
//}
ci = new CultureInfo(langName);
this.Session["Culture"] = ci;
this.Session["UiClaim"] = false;
}
else
{
var lang = ((ClaimsIdentity)User.Identity).FindFirst(UserClaims.User_Language);
if (lang!=null && lang.Value!="None" && ci.Name!=lang.Value)
{
if (this.Session["UiClaim"].Equals(false))
{
ci = new CultureInfo(lang.Value);
this.Session["Culture"] = ci;
this.Session["UiClaim"] = true;
}
}
}
Thread.CurrentThread.CurrentUICulture = ci;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name);
}
}
[所有控制器都继承了SwitchUICulture操作所在的基本控制器。在“区域”之外,一切都很好,但是当我在任何区域内的视图中运行都失败时,我得到此URL
有人对此有解决方案吗?
我认为您的路径网址不正确。点击网址或提供更多的控制器和区域。我会帮助你
太简单了,解决方案太接近了:)将Area =“”添加到Url.Action就已完成。
<div class="dropdown-menu dropdown-menu-fit dropdown-menu-right dropdown-menu-anim dropdown-menu-top-unround">
<ul id="mLangSel" class="kt-nav kt-margin-t-10 kt-margin-b-10">
<li id="mLangEn" class="kt-nav__item ">
<a href="@Url.Action("SwitchUICulture","Home",new {lang="en", area = ""})" class="kt-nav__link">
<span class="kt-nav__link-icon"><img class="rounded-circle" data-offset="10px,0px" src="~/assets/media/flags/012-uk.svg" alt="" /></span>
<span class="kt-nav__link-text" style="margin-left:10px">@Menus.MENU_LANG_ENGLISH</span>
</a>
</li>
<li id="mLangIs" class="kt-nav__item">
<a href="@Url.Action("SwitchUICulture","Home",new {lang="is-IS", area = "" })" class="kt-nav__link">
<span class="kt-nav__link-icon"><img class="rounded-circle" style="width:30px;height:auto;" src="~/assets/media/flags/is_iceland.svg" alt="" /></span>
<span class="kt-nav__link-text" style="margin-left:10px">@Menus.MENU_LANG_ICELANDIC</span>
</a>
</li>
</ul>
</div>
这是更正的代码段