汇编后的ASP.NET MVC切换培养物以进行初始负载
-
28-09-2019 - |
题
我有一个混合ASP.NET Web表单/MVC应用程序。在MVC的“页面”/视图之一上,我使用toshortDateString()和tolongdateString()呈现一堆日期。这些大多数时间都正确地工作了,但是在编译应用程序后我第一次加载视图时,它们的格式不正确。
我追踪了这一点,并检查了当前线程的文化。在99%的时间内,它是EN-US,但是在编译后的MVC视图的第一个负载下,将其设置为engB。如果我在那之后立即重新加载页面,那就回到en-us。
我已经尝试在Web.config文件中设置文化和UICULTURE,以迫使它是正确的,但没有运气。
有人对此有任何想法吗? 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下降。随后的所有负载正确处理培养物。仅更改.aps文件并不会导致此功能,就必须编译C#代码才能引起这一点。
更多数据:我将其跟踪到渲染方法。在渲染方法之前,培养为en-us,然后是engb(仅在汇编后才在初始pageload上)。
解决方案 2
事实证明,这是由于对过时的依赖性,第三方.dll引起的。一旦我跟踪它并获得了更新的.dll,一切都很好。
其他提示
在您的视图中,尝试创建一个基本视图 - 然后,对于该特定视图,请在此处从中继承下来: 如何全球化ASP.NET MVC视图(尤其是十进制分离器)?但是您的更像是:
protected override void InitializeCulture() { base.InitializeCulture(); CultureInfo cultureInfo = new CultureInfo("en-US"); Thread.CurrentThread.CurrentUICulture = cultureInfo; }
我相信全球化密钥正常工作存在一些问题。
我对您的.aspx页面的第一个观察结果,
您没有从基本视图页类继承您的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>" %>
您是否尝试过制作基本控制器?我用一个工作的应用程序改变了文化,效果很好。
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);
}
}