使用FindControl访问基页上的母版页控件

时间:2011-10-05 05:17:45

标签: asp.net master-pages findcontrol contentplaceholder

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

现在问题: 我在母版页上有一个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变量中设置的。问题是当页面呈现时,不会呈现ContentPlaceHolder中用于aspx页面的内容。

我可以看到它是涉及FindControl的代码,因为如果我将语言设置为字符串,一切都按预期工作。

string language = "de-DE";

我做错了什么?

更新 如果MasterPage上的ContentPlaceHolder上有一些内容,则会呈现它而不是页面ContentPlaceHolder。

3 个答案:

答案 0 :(得分:2)

page life cycle中甚至在PreInit之前调用InitializeCulture,这意味着尚未设置控件,并且该控件的值可能以空字符串形式出现。

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

答案 1 :(得分:0)

正如Doozer正确地指出,控制不可能在InitializeCulture时设置正确的值。我建议您从请求中的POST数据中读取值,并通过一些默认值将其返回。例如,

string language = Request.Form[Master.FindControl("cmbLanguage")).UniqueID];
language = string.IsNullOrWhiteSpace(language) ? "de-DE" : language;

答案 2 :(得分:0)

为了访问MasterPage控件,最好使用MasterType指令。使用时,您将能够以强类型方式访问母版页。在这种情况下,您将能够在母版页上创建一个属性,如下所示:

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

在页面本身,您将能够运行如下代码:

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

}