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

Zas*_*shi 4 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;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

我有我的观点:

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

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

Oli*_*ier 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你看来:

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

您可以考虑将会话或类似的用户数据存储起来.

编辑:

例如,您可以在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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

将Cookie保存在SetLanguage操作中:

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

在Application_BeginRequest中获取cookie:

var cookie = HttpContext.Current.Request.Cookies["_culture"];
var name = cookie != null ? cookie.Value : null;
Run Code Online (Sandbox Code Playgroud)