为什么RedirectToAction改变了ThreadID?

时间:2011-12-28 12:38:19

标签: c# asp.net-mvc

我有一个Web应用程序(ASP.NET MVC 3),支持en-US,pt-BR,es-ES本地化。

public class HomeController : Controller
{
  public ActionResult Index()
  {
    int threadId = Thread.CurrentThread.ManagedThreadId;
    string threadUICulture = Thread.CurrentThread.CurrentUICulture.ToString();
    return View();
  }
}

public class LanguageController : Controller
{
  public ActionResult EN()
  {
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    return RedirectToAction("Index", "Home");
  }

  public ActionResult ES()
  {
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-ES");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("es-ES");

    int threadId = Thread.CurrentThread.ManagedThreadId;
    return RedirectToAction("Index", "Home");
  }

  public ActionResult PT()
  {
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("pt-BR");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-BR");
    return RedirectToAction("Index", "Home");
  }
}

我使用文化en-US启动应用程序,使用ActionLink,我将语言/ ES调用为西班牙语并重定向到索引页面。但是不行,索引页仍然是英文...

我看到方法LanguagesController.ES和HomeController.Index上的Thread ID不同。

在ASP.NET MVC应用程序上管理本地化的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

这是因为每个请求都是从线程池中提取的线程提供的。因此,虽然第一个请求可以在线程A上提供,但第二个请求可以在线程B上提供。您需要在某个地方保留有关当前文化的信息。这可能是:会话,cookie,一些URL路由参数等。看看以下localization guide

答案 1 :(得分:0)

我认为,在您的控制器中,设置会话文化应该有效。

会话[“文化”] =新的CultureInfo(“es-ES”);

HttpContext.Session [“culture”] =新的CultureInfo(“es-ES”);