活动语言是从url确定的,然后在
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);这样,就可以从正确的资源文件中检索翻译。
在控制器上使用异步操作时,我们有一个后台线程,其中Thread.CurrentThread.CurrentUICulture被设置为OS默认值。但在后台线程上,我们需要正确的语言。
我创建了一个TaskFactory扩展来将区域性传递给后台线程,它看起来如下所示:
public static Task StartNew(this TaskFactory taskFactory, Action action, CultureInfo cultureInfo)
{
return taskFactory.StartNew(() =>
{
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
action.Invoke();
});
}这允许我在操作控制器中执行以下操作:
[HttpPost]
public void SearchAsync(ViewModel viewModel)
{
AsyncManager.OutstandingOperations.Increment();
AsyncManager.Parameters["task"] = Task.Factory.StartNew(() =>
{
try
{
//Do Stuff
AsyncManager.Parameters["viewModel"] = viewModel;
}
catch (Exception e)
{
ModelState.AddModelError(string.Empty, ResxErrors.TechnicalErrorMessage);
}
finally
{
AsyncManager.OutstandingOperations.Decrement();
}
}, Thread.CurrentThread.CurrentUICulture);
}
public ActionResult SearchCompleted(Task task, ViewModel viewModel)
{
//Wait for the main parent task to complete. Mainly to catch all exceptions.
try { task.Wait(); }
catch (AggregateException ae) { throw ae.InnerException; }
return View(viewModel);
}这一切都很完美,但我确实有些顾虑。
这是在调用原始操作之前通过设置区域性来扩展操作的正确方法吗?
有谁知道将te CurrentUICulture传递给ASP.NET MVC异步操作的后台线程的不同方法吗?
。
对这段代码还有其他评论吗?
谢谢
发布于 2012-01-30 07:47:36
问题中所描述的方式似乎就是答案。
https://stackoverflow.com/questions/7511318
复制相似问题