2

我在 .NET 4.0 上有一个 ASP.NET 网站应用程序。有一个 Masterpage 包含所有 aspx 页面的页眉和页脚。内容来自各个 aspx 页面。我有 BasePage.cs,所有 aspx 页面都继承自它。

现在解决问题:我在母版页上有一个 HTML Select 控件,我试图使用以下代码在 BasePage.cs 中检索其值

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

我在 InitializeCulture 方法中使用它,该方法将为网站设置文化信息。

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 之前被调用,这意味着尚未设置控件,并且该控件的值很可能以空字符串的形式出现。

您可能需要通过 cookie、会话值或其他方法来更改读取文化的方式。我不熟悉这样做,所以我没有很好的建议或最佳实践。

于 2011-10-05T05:46:20.310 回答
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 回答
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 回答