MVC3(Razor) - 不以编程方式更改UI文化语言

Sco*_*ion 0 asp.net-mvc razor asp.net-mvc-3

我正在尝试使用Select语言功能开发MVC3(razor)应用程序.

使用以下视图作为_SelectCulture上的部分视图_Layout.cshtml

<text>
   @Html.ActionLink("English", "SetCulture", new { controller = "Culture", culture = "en-GB" })  
   | 
   @Html.ActionLink("Welsh", "SetCulture", new { controller = "Culture", culture = "cy-GB" })
</text>
<div>
    @System.Threading.Thread.CurrentThread.CurrentUICulture.ToString()
</div>
Run Code Online (Sandbox Code Playgroud)

CultureController

public ActionResult SetCulture(string culture)
        {
        System.Globalization.CultureInfo ci = new     System.Globalization.CultureInfo(culture);

            System.Threading.Thread.CurrentThread.CurrentCulture = ci;
            System.Threading.Thread.CurrentThread.CurrentUICulture = ci;

            return RedirectToAction("Index", "Home");
        }
Run Code Online (Sandbox Code Playgroud)

但它仍然没有改变语言.

请帮忙.

谢谢

Dar*_*rov 8

好吧,你正在改变当前线程的语言.当前线程以当前请求结束,稍后在执行控制器操作之后.然后,您将重定向到其他控制器操作.然后ASP.NET生成一个新线程来提供这个请求,显然没有文化集.

所以你必须在某个地方坚持这种变化.基本上有3种不同的方法:

  1. 路线变量
  2. 饼干
  3. 会议

我把它们按照优先顺序排列.第一种方法包括{culture}在所有路线中集成令牌.恕我直言,这也是SEO方面的最佳方法.因此,/fr/home/index如果您想用法语获取您的网站,您将重定向到例如.然后,您可以使用将在每个操作之前运行的自定义操作过滤器属性,检查区域性路径参数并设置当前线程区域性(此时间为当前操作).

Cookie和会话还涉及在请求之间保持当前语言.在第一个示例中,这是在客户端上完成的,而在第二个示例中,它是在服务器中完成的.再一次,可以使用自定义操作过滤器在每个操作之前读取语言的值,并反映当前的线程文化.

您可以查看以下指南,该指南使用Session来保留当前语言.