我在.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。
答案 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;
}