ASP.NET MVC5单击Html.ActionLink更改语言/文化

时间:2014-10-29 11:00:45

标签: asp.net asp.net-mvc-5

我的ASP.NET MVC5应用程序出现问题。我的应用程序可以设置在浏览器中设置的lang / culture(现在只有英语和波兰语(默认))。我想通过点击Html.ActionLink让用户改变语言/文化。

我创建了一个类:

namespace Guestbook
{
    public static class Click
    {
        public static void SetCulture(string name)
        {
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
        }

    }
}

我的观点中有:

@Html.ActionLink("PL", "", "Guests", routeValues: null, htmlAttributes: new { onclick = "SetCulture(\"pl\");" })
@Html.ActionLink("EN", "", "Guests", routeValues: null, htmlAttributes: new { onclick = "SetCulture(\"en\");" })

当然,它不起作用。我还需要什么? JavaScript函数?

2 个答案:

答案 0 :(得分:8)

最简单的答案是您需要创建一个然后链接到的控制器。

public class LanguageController : Controller
{
    public ActionResult SetLanguage(string name)
    {
        Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
        Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

        HttpContext.Current.Session["culture"] = name;

        return RedirectToAction("Index", "Home");
    }
}

然后在你看来:

<a href="@Url.Action("SetLanguage", "Language", new { @name = "pl" })">Polski</a>
<a href="@Url.Action("SetLanguage", "Language", new { @name = "en" })">English</a>

您可以考虑将会话或类似用户数据存储。

编辑:

例如,您可以在global.asax中使用Application_BeginRequest事件。

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    var name = HttpContext.Current.Session["culture"] as string;

    if (string.IsNullOrEmpty(name))
    {
        return;
    }

    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
    System.Threading.Thread.CurrentThread.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentCulture;
}

编辑:

将Cookie保存在SetLanguage操作中:

var cookie = new HttpCookie("_culture", name);
cookie.Expires = DateTime.Today.AddYears(1);
Response.SetCookie(cookie);

在Application_BeginRequest中获取cookie:

var cookie = HttpContext.Current.Request.Cookies["_culture"];
var name = cookie != null ? cookie.Value : null;

答案 1 :(得分:1)

我创建了一个小型控制器并编辑了我的视图。 @Olivier(感谢队友!)向我展示了如何做到这一点,但它没有用,因为我的应用程序将文化存储在cookie中,而不是存储在会话中。

控制器:

public class LanguageController : BaseController
    {
        // GET: Language
        public ActionResult SetLanguage(string name)
        {
            Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(name);
            Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

            HttpCookie cultureCookie = new HttpCookie("_culture");
            cultureCookie.Value = name;
            cultureCookie.Expires = DateTime.UtcNow.AddYears(1);

            Response.Cookies.Remove("_culture");
            Response.SetCookie(cultureCookie);


            return RedirectToAction("Index", "Guests");
        }
    }

LanguageController继承自BaseController(继承自Controller),因为我使用了本教程:ASP.NET MVC 5 Internationalization by Nadeem Afana

在我的观点中:

<a href="@Url.Action("SetLanguage", "Language", new { @name = "pl" })">Polski</a>
<a href="@Url.Action("SetLanguage", "Language", new { @name = "en" })">English</a>