ASP.NET MVCスイッチング培養最初の負荷のためにコンパイル後
-
28-09-2019 - |
質問
ハイブリッドASP.NET Webフォーム/MVCアプリがあります。 MVCの「ページ」/ビューの1つでは、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フォームページは、システムから下降しても影響を受けません。Web.MVC.ViewPage。後続のすべての負荷は、培養を正しく扱います。 .aspxファイルを変更するだけでは、これを引き起こすことはありません。これを引き起こすためにC#コードをコンパイルする必要があります。
その他のデータ:レンダリング方法まで追跡しています。レンダリング方法の前に、文化はEN-USであり、その後はEN-GBです(再びコンピレーション後の最初のページロードでのみ)。
解決 2
これは、時代遅れの第三者.dllへの依存によって引き起こされることが判明しました。追跡して、更新された.dllを取得したら、すべてが再び良かったです。
他のヒント
あなたのビューでは、ベースビューを作成してみてください - その特定のビューのために、ここで行われたように継承してください。 ASP.NET MVCビューをグローバル化する方法(特に小数分層)は?しかし、あなたのものは次のようになります:
protected override void InitializeCulture() { base.InitializeCulture(); CultureInfo cultureInfo = new CultureInfo("en-US"); Thread.CurrentThread.CurrentUICulture = cultureInfo; }
グローバリゼーションキーが正しく機能することにいくつかの問題があったと思います。
文化をどのようにWeb構成に設定しましたか?
「グローバリゼーション」キーを使用していますか?
見て:
あなたの.aspxページに対する私の最初の観察、
Base 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>" %>
ベースコントローラーを作ってみましたか?私はそれでアプリでアプリを使って文化を変えました。
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);
}
}