我正试图围绕MVC.NET 3。
我使用_Layout.cshtml
作为基础(结构,导航)。作为布局的一部分,我想显示两个用于更改语言/本地化的链接。
无论查看哪个页面,都应显示和点击这些内容,并且在更改本地化后我想重新加载调用该操作的视图。因此,将重新加载客户正在查看的页面,并设置新的本地化。
一种方法是在每个站点控制器中复制和粘贴本地化更改操作,但是没有更简单,更优雅的方式吗?
我尝试创建一个处理本地化更改的特定控制器,但无法弄清楚如何将查看器返回到前一个控制器。
使用jquery可能更容易实现这一点吗?
这是DIV
文件中带有语言更改按钮的_Layout
。它调用当前控制器中的动作,这意味着我必须在每个站点的控制器中定义它。 (好的是返回的视图总是正确的。)
<div id="top>
@using (Html.BeginForm())
{
<button id="sv_flag" name="localization" title="@Resources.Global.Sv_Flag_Hover" value="sv-SE" />
<button id="en_flag" name="localization" title="@Resources.Global.En_Flag_Hover" value="en-GB" />
}
</div>
我也试过使用一个特定的控制器,但是想不出我之后怎么回到当前视图?像这样:
@using (Html.BeginForm("LocalizationAction", "LocalizationController"))
...
修改
现在使用Darin的建议,我从布局页面发送controller
和action
值:
@using (Html.BeginForm("SetLocalization", "Localization",
new { returnController = @ViewContext.Controller.ValueProvider.GetValue("controller").RawValue,
returnAction = @ViewContext.Controller.ValueProvider.GetValue("action").RawValue }))
...
但我无法让本地化更改正常工作,我的控制器操作如下所示:
public ActionResult SetLocalization(string localization, string returnController, string returnAction)
{
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(localization);
return RedirectToAction(returnAction, returnController);
}
答案 0 :(得分:3)
您可以传递returnUrl:
@using (Html.BeginForm("LocalizationAction", "LocalizationController", new { returnUrl = Request.Url.AbsoluteUri }))
{
...
}
并在LocalizationAction
内部重定向到此网址:
public ActionResult LocalizationAction(string returnUrl)
{
... do your localization stuff and once you are done get back:
return Redirect(returnUrl);
}
显然你可以在盲目重定向之前做一点检查。 returnUrl参数是否为空以及是否属于您的域。您可以查看默认AccountController
在对用户进行身份验证后如何执行此操作。
答案 1 :(得分:2)
返回重定向(Request.UrlReferrer.ToString());
public ActionResult Change(String LanguageAbbrevation)
{
if (LanguageAbbrevation != null)
{
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguageAbbrevation);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguageAbbrevation);
}
HttpCookie cookie = new HttpCookie("Language");
cookie.Value = LanguageAbbrevation;
Response.Cookies.Add(cookie);
return Redirect(Request.UrlReferrer.ToString());
}
答案 2 :(得分:1)
我找到了一个与我的问题完全不同(更容易和更优雅)的解决方案。
我只创建了一个BaseController
,其中包含更改本地化的操作。
然后我添加到网站的所有控制器都继承自此BaseController
。这为代码提供了一个位置,并且不需要发送任何返回参数等。
BaseController
:
public class BaseController : Controller
{
[HttpPost]
public ActionResult Index(string localization)
{
Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(localization);
return View();
}
}
每个网站的Controllers
只需要从中继承,然后介意自己的行为:
public class ApplicationsController : BaseController
{
//
// GET: /Applications/
public ActionResult Index()
{
return View();
}
}
...