mvc 3 设置当前文化不变量

Posted

技术标签:

【中文标题】mvc 3 设置当前文化不变量【英文标题】:mvc 3 set current culture invariant 【发布时间】:2011-12-12 16:28:54 【问题描述】:

我正在尝试将当前文化设置为不变

在我的 web.config 中完成此操作

 <globalization uiCulture="" culture="" />

将此添加到我的 Application_Start()

System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

但是当我在控制器上调用该方法时,Thread.CurrentThread.CurrentCulture 设置为 da-DK

这怎么可能?

【问题讨论】:

【参考方案1】:

只有在应用程序启动后才能在当前线程上设置区域性。但用户请求可能由另一个线程处理。

因此,解决方案是确保在每个请求开始时,在该线程上设置正确的文化。

在 MVC 3 中,您可以通过在 Controller 的 OnActionExecuting() 方法中设置正确的文化来做到这一点。

【讨论】:

【参考方案2】:

您需要在请求线程上设置CurrentCultureCurrentUICulture。这可以通过在控制器或应用的动作过滤器中覆盖OnActionExecutedOnActionExecuting 方法来完成:

protected override void OnActionExecuted(ActionExecutedContext filterContext)

    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
    System.Threading.Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

更新:如果您想处理模型绑定场景,您必须放弃操作过滤器:

public void Application_OnBeginRequest(object sender, EventArgs e)

    var culture = GetCulture();
    Thread.CurrentThread.CurrentCulture = culture;
    Thread.CurrentThread.CurrentUICulture = culture;

【讨论】:

你会想的。有关更多信息,请参阅此问题的答案:***.com/questions/1100061/… 愚蠢的是,我必须使用自定义操作过滤器来表示我的所有方法才能使其正常工作。难道不能在全球范围内完成吗? 当然。假设您使用的是 MVC 3,您可以配置全局操作过滤器。请参阅以下链接:odetocode.com/Blogs/scott/archive/2011/01/15/… 感谢您提供该链接。并寻求帮助:-) 这不适用于模型绑定!再往下看我的答案。【参考方案3】:

如this question 所述,如果您希望它对模型绑定器产生任何影响,则需要使用 application_beginrequest。

Modelbinder 在调用控制器的操作之前执行,因为它们创建的值会传递到控制器的操作中

【讨论】:

以上是关于mvc 3 设置当前文化不变量的主要内容,如果未能解决你的问题,请参考以下文章

MVC 忽略 web.config 中的文化设置

asp.net mvc 在哪里设置默认文化?

序列化\反序列化 - 我应该使用不变的文化信息还是保留当前的文化信息

MVC3 中模型 DisplayFormat 的 DataFormat 错误

使用 ASPNETCore 1.1.1 本地化默认将当前文化设置为浏览器文化

什么是不变文化?