3

我有一个混合 ASP.Net Web 表单/MVC 应用程序。在其中一个 MVC“页面”/视图上,我让它使用 ToShortDateString() 和 ToLongDateString() 呈现一堆日期。这些大部分时间都可以正常工作,但是在编译应用程序后第一次加载视图时,它们的格式不正确。

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

我尝试将 web.config 文件中的文化和 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(同样仅在编译后的初始页面加载时)。

4

5 回答 5

1

在您看来,尝试创建一个基本视图 - 然后为该特定视图继承它,如下所示:如何全球化 ASP.NET MVC 视图(特别是小数分隔符)? 但是你的更像是:

受保护的覆盖无效 InitializeCulture()
{
    base.InitializeCulture();
    CultureInfocultureInfo = new CultureInfo("en-US");
    Thread.CurrentThread.CurrentUICulture =cultureInfo;
}

我相信全球化密钥正常工作存在一些问题。

于 2011-05-15T03:22:28.133 回答
1

事实证明,这是由对过期的第三方 .dll 的依赖引起的。一旦我找到它,并得到更新的 .dll,一切又好了。

于 2011-05-16T23:04:08.517 回答
0

您如何将文化设置到网络配置中?

你在使用“全球化”键吗?

看一下:

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

于 2010-11-04T09:55:43.907 回答
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);
    }
}
于 2011-05-15T19:27:12.383 回答
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>" %>
于 2011-05-16T01:12:29.950 回答