1

我正在尝试围绕 MVC.NET 3。

我使用 a_Layout.cshtml作为基础(结构,导航)。作为布局的一部分,我想显示两个用于更改语言/本地化的链接。

无论查看哪个页面,这些都应该显示并可点击,并且在更改本地化后我想重新加载调用 action 的视图。因此,客户正在查看的页面将被重新加载,并设置新的本地化设置。

一种方法是在每个站点控制器中复制和粘贴更改本地化的操作,但没有更简单、更优雅的方法吗?

我尝试创建一个处理本地化更改的特定控制器,但无法弄清楚如何将查看器返回到前一个控制器。

也许这用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);
    }
4

3 回答 3

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对用户进行身份验证后执行此操作。

于 2012-07-07T17:29:53.970 回答
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());
    }
于 2016-05-23T13:24:15.567 回答
1

我为我的问题找到了一个完全不同的(而且更简单、更优雅)的解决方案。

我只是创建了一个BaseController, 它包含更改本地化的操作。

然后我添加到站点的所有控制器都继承自 this 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();
    }
}
...
于 2012-07-07T19:07:48.330 回答