编译初始加载后ASP.Net MVC切换文化

时间:2010-11-03 20:55:58

标签: c# asp.net-mvc datetime formatting currentculture

我有一个混合ASP.Net网络表单/ MVC应用程序。在其中一个MVC“页面”/视图中,我使用ToShortDateString()和ToLongDateString()渲染了一堆日期。这些在大多数情况下都能正常工作,但是第一次在编译应用程序后加载视图时,它们的格式不正确。

我追查了这一点并检查了当前线程的文化。 99%的时间它是en-US,但在编译后第一次加载MVC视图时,它被设置为en-GB。如果我在此之后立即重新加载页面,则会返回到en-US。

我已尝试将web.config文件中的culture和uiculture设置为en-US以强制它正确,但没有运气。

任何人对此都有任何想法吗? MVC中的错误?

编辑(附加代码和尝试): 即使我完全超越并将其包含在视图的基类中

public class DNViewPage<T> : ViewPage<T> where T : class
    {

        protected override void OnInit(EventArgs e) {
            base.OnInit(e);
            CultureInfo cultureInfo = new CultureInfo("en-US");
            this.Culture = "en-US";
            this.UICulture = "en-US";
            Thread.CurrentThread.CurrentUICulture = cultureInfo;
            Thread.CurrentThread.CurrentCulture = cultureInfo;
        }

        protected void Page_Load(object sender, EventArgs e) {
            CultureInfo cultureInfo = new CultureInfo("en-US");
            this.Culture = "en-US";
            this.UICulture = "en-US";
            Thread.CurrentThread.CurrentUICulture = cultureInfo;
            Thread.CurrentThread.CurrentCulture = cultureInfo;
        }

        protected override void InitializeCulture() {

            CultureInfo cultureInfo = new CultureInfo("en-US");
            this.Culture = "en-US";
            this.UICulture = "en-US";
            Thread.CurrentThread.CurrentUICulture = cultureInfo;
            Thread.CurrentThread.CurrentCulture = cultureInfo;

            base.InitializeCulture();
        }
    }

并将其包含在web.config

<globalization requestEncoding="utf-8" responseEncoding="utf-8" uiCulture="en-US" culture="en-US"/>

,这在.aspx文件的标题中

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Culture="en-US" UICulture="en-US"

同样,这只是在编译代码之后的初始加载时,首次加载该页面时。其他Web表单页面不受影响,即使它们来自System.Web.Mvc.ViewPage。所有后续负载都正确处理文化。只是更改.aspx文件不会导致这种情况,必须编译c#代码才能导致这种情况。

更多数据: 我将它跟踪到Render方法。在Render方法之前,文化是en-US,之后它是en-GB(再次仅在编译后的初始页面加载时)。

5 个答案:

答案 0 :(得分:1)

在您的视图中,尝试创建一个基本视图 - 然后为该特定视图继承它,如下所示:How to globalize ASP.NET MVC views (decimal separators in particular)? 但是你的更像是:

protected override void InitializeCulture()
{
    base.InitializeCulture();
    CultureInfo cultureInfo = new CultureInfo("en-US");
    Thread.CurrentThread.CurrentUICulture = cultureInfo;
}

我认为全球化密钥正常运作存在一些问题。

答案 1 :(得分:1)

原来这是由对过时的第三方.dll的依赖引起的。一旦我追踪它,并得到更新的.dll,一切都很好。

答案 2 :(得分:0)

您如何将文化设置为Web配置?

你使用“全球化”键吗?

看看:

http://msdn.microsoft.com/en-us/library/bz9tc508.aspx

答案 3 :(得分:0)

你试过制作一个基本控制器吗?我在应用程序中改变了文化,工作得非常好。

public class BaseController : Controller
{
    public string ActionName;
    public string ControllerName;

    protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //Switch the language in here?
       CultureInfo cultureInfo = new CultureInfo("en-US");
        this.Culture = "en-US";
        this.UICulture = "en-US";
        Thread.CurrentThread.CurrentUICulture = cultureInfo;
        Thread.CurrentThread.CurrentCulture = cultureInfo;

        base.OnActionExecuting(context);
    }
}

答案 4 :(得分:0)

我对.aspx页面的第一次观察,

您没有从基础ViewPage类继承ASPX页面。尝试将此添加到ASPX页眉标记。

Inherits="XXX.Views.DNViewPage<YYY.Models.zzzViewModel>"

所以看起来应该是这样,

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="XXX.Views.DNViewPage<YYY.Models.zzzViewModel>" %>