如何解决共享布局或共享控制器中进行本地化?
我将本地化菜单放置在共享布局(_Layout.cshtml)中,以允许菜单显示在每个网页中。
_Layout.cshtml
<div class="form-inline RightMenuBar">
<div>@*@ViewBag.Language  &nbsP*@</div>
<form action="@Url.Action("Index","Home")" method="get" id="ChangeLangForm">
<select class="ChangeLanguage">
<option Value="zh-HK">繁體中文</option>
<option Value="en-US">English</option>
</select>
<input type="hidden" name="L" class="Lang" />
</form>
</div>
表单将在更改时提交并触发终点
$('.ChangeLanguage').on('change',function () {
console.log($('.Lang').val($('.ChangeLanguage option:selected').val()));
$('#ChangeLangForm').submit();
});
在控制器中,它将使用通过表单传递的值并创建cultureinfo,最后将合适的文本从本地化资源放入ViewBag,然后返回View
public class HomeController : Controller
{
UserMenuDBService UserMenuService = new UserMenuDBService();
// GET: Home
public ActionResult Index(string L)
{
if (! this.Request.IsAuthenticated)
{
return this.RedirectToAction("Login","User");
}
UserMenu Data = new UserMenu();
string Userid = (string)Session["Userid"];
Data.DataList = UserMenuService.GetDataList(Userid);
if (L == null)
{
if (Request.Cookies["Language"] == null)
{
L = "zh-HK";
}
else {
if (Request.Cookies["Language"].Value == "")
L = "zh-HK";
else
L = Request.Cookies["Language"].Value;
}
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(L);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(L);
ViewBag.Lang = L;
}
else
{
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(L);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(L);
ViewBag.Lang = L;
Response.Cookies.Remove("Language");
HttpCookie myCookie = new HttpCookie("Language");
myCookie.Value = L;
myCookie.Expires = DateTime.Now.AddDays(9999d);
Response.Cookies.Add(myCookie);
}
ViewBag.Lang = L;
ViewBag.title = Localization.Resource.title;
ViewBag.news = Localization.Resource.news;
return View(Data);
}
}
/HOME/index.cshtml
<h2>@ViewBag.title</h2>
@ViewBag.news
现在,它可以成功显示基于所选值的相应语言。
但是,如果我尝试将_Layout.cshtml应用于其他网站,则当我更改人工时,它将自动将网站重定向到HOME / index.cshtml 就像我在SETTING / index.cshtml中更改人工费一样,它将重定向到HOME / index.cshtml
我知道是由于_Layout.cshtml中的表单始终调用HOMECONTROLLER来处理本地化所致,所以即使我在home / index.cshtml页面之外触发它,它也始终会将用户重定向到它。
所以我的问题是,我可以设计一个共享控制器吗?
我的想法是,设计一个返回ViewBag的控制器,该控制器包含整个本地化资源字符串,并且前端将使用他们想要的字符串(另一方面,它将传递许多多余的字符串,这似乎不好)
我正在考虑创建一个对象,该对象存储本地化资源文件中的所有字符串,控制器将从中获取所需的字符串并将其存储到ViewBag中,然后将其返回到前端。
但是,我关心的是,当前我是通过使用表单调用控制器来触发本地化的,这意味着我只能创建一个共享控制器来做到这一点?还是我可以设计一个动态共享布局页面,它可以根据哪个页面的用户调用不同的控制器?
就像在Home / index中将调用home控制器,在Setting / index中将调用设置控制器等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。