在_Layout.cshtml中执行操作后返回当前视图

时间:2012-07-07 16:44:54

标签: asp.net-mvc-3

我正试图围绕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的建议,我从布局页面发送controlleraction值:

@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);
    }

3 个答案:

答案 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();
    }
}
...