2017-03-27 3 views
0

私は、ユーザー構成に基づいてスレッドカルチャを変更する基本ページクラスを持つASP.NET Webforms Webサイトを持っています。私たちは、基本的にこれをやっている:埋め込みコードブロックでスレッドの文化が尊重されない

protected override void InitializeCulture() 
{ 
    Culture = UICulture = Customer.Culture; 
    Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentUICulture = new CultureInfo(Customer.Culture); 

    base.InitializeCulture(); 
} 

Customer.Cultureは私がDBから取得するだけでいくつかのデータなので、ほとんどの...私はen-usまたはfr-CAを得ることができますし、それが働いています。

私は

<%# MyPrice %> 

を行う。そして、私はDataBindメソッドを呼び出した場合、それは完璧に働いているのに対してのCurrentCultureが

<%= MyPrice %> 

のように埋め込まれたコードブロックで表彰されていないことが分かりました。

したがって、「データバインディング式に切り替える必要があります」という予期された回答以外に、文化が尊重されていない理由はありますか?

答えて

0

.NET Frameworkのソースコードを掘り下げた後、なぜこれがこのように動作しているのかがわかりました。

私(および多くの.NET開発者ですか?)は、<%= %>はに相当すると考えていましたが、実際はPage.Renderメソッド内でHtmlTextWriter.Writerと同等と見なすことができます。

たTextWriterクラスを見てみましょう場合は、Writeメソッドは次のようになります(https://referencesource.microsoft.com/#mscorlib/system/io/textwriter.cs,275

public virtual void Write(double value) { 
    Write(value.ToString(FormatProvider)); 
} 

ので、ここで重要なのは、FormatProvider何であるか、ですか。

public HtmlTextWriter(TextWriter writer, string tabString) : base(CultureInfo.InvariantCulture) { 

はすべてのすべてで、<%=%>CurrentThread.Cultureが、CultureInfo.InvariantCultureを使用しないで処理されます:私はCurrentThread.Cultureに等しいが、我々はHtmlTextWriterをチェックすると、これが)使用されているコンストラクタ:(https://referencesource.microsoft.com/#System.Web/UI/HTMLTextWriter.cs,653で、これはあることを期待します。

関連する問題