2

.NET 4.0 で ASP.NET Web サイト アプリケーションを使用しています。すべての aspx ページのヘッダーとフッターを含む 1 つのマスターページがあります。コンテンツは個々の aspx ページから取得されます。すべての aspx ページが継承する BasePage.cs があります。

問題は次のとおりです。マスターページに HTML Select コントロールがあり、その値を以下のコードを使用して BasePage.cs で取得しようとしています。

string language = ((System.Web.UI.HtmlControls.HtmlSelect)Master.FindControl("cmbLanguage")).Value;

これを InitializeCulture メソッド内で使用しています。これにより、Web サイトのカルチャ情報が設定されます。

protected override void InitializeCulture()
{

    string language = ((System.Web.UI.HtmlControls.HtmlSelect)Master.FindControl("cmbLanguage")).Value;

    Thread.CurrentThread.CurrentCulture =
        CultureInfo.CreateSpecificCulture(language);
    Thread.CurrentThread.CurrentUICulture = new
        CultureInfo(language);
    base.InitializeCulture();
}

languageデバッグ中に、期待値が変数に設定されていることがわかります。問題は、ページがレンダリングされるときに、aspx ページの ContentPlaceHolder 内のコンテンツがレンダリングされないことです。

FindControl言語を文字列に設定すると、すべてが期待どおりに機能するため、コードが原因であることがわかります。

string language = "de-DE";

私は何を間違っていますか?

更新: MasterPage の ContentPlaceHolder にコンテンツがある場合、ページ ContentPlaceHolder の代わりにレンダリングされます。

4

3 に答える 3

2

InitializeCulture は、ページのライフ サイクルで PreInit よりも前に呼び出されます。これは、コントロールがセットアップされておらず、そのコントロールの Value が空の文字列として渡される可能性が高いことを意味します。

Cookie、セッション値、またはその他の方法を使用して、カルチャの読み取り方法を変更する必要がある可能性があります。私はそれを行うことに慣れていないので、素晴らしい提案やベストプラクティスはありません。

于 2011-10-05T05:46:20.310 に答える
0

Doozer が正しく指摘しているように、 の時点でコントロールに正しい値が設定されている可能性は低いとされていますInitializeCulture。リクエストの POST データから値を読み取り、デフォルト値を介して戻すことをお勧めします。例えば、

string language = Request.Form[Master.FindControl("cmbLanguage")).UniqueID];
language = string.IsNullOrWhiteSpace(language) ? "de-DE" : language;
于 2011-10-05T06:17:55.223 に答える
0

MasterPage コントロールにアクセスするには、MasterTypeディレクティブを使用することをお勧めします。使用すると、強く型付けされた方法でマスター ページにアクセスできるようになります。この場合、次のようにマスター ページにプロパティを作成できます。

public string SelectedCulture
{
    get
    {
        return cmbLanguage.Value
    }
}

また、ページ自体で次のようなコードを実行できます。

protected override void InitializeCulture() {
    string language = this.Master.SelectedCulture;

}
于 2011-10-05T06:49:21.457 に答える