我有一个混合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(再次仅在编译后的初始页面加载时)。
答案 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)
答案 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>" %>