2011-10-05 49 views
1

我在.NET 4.0上有一个ASP.NET网站应用程序。有一个Masterpage包含所有aspx页面的页眉和页脚。内容来自个人aspx页面。我有所有的aspx页面继承的BasePage.cs。使用FindControl访问基页上的主页控件

现在的问题: 我对母版一个HTML选择控制,其值我尝试使用下面的代码

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

我使用这个InitializeCulture内的BasePage.cs检索方法,它将为网站设置文化信息。

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"; 

我在做什么错?

UPDATE: 如果对母版中的ContentPlaceHolder一些内容,那么它就会被渲染,而不是页面的ContentPlaceHolder。

+0

是任何内容(标记)在MasterPage的ContentPlaceHolder **中? contentplaceholder控件中的标记不会被渲染。 – adatapost

+0

@AVD:MasterPage的ContentPlaceHolder中没有内容。 – itsbalur

+0

忘记母版页,您无法在InitializeCulture调用时访问任何控件,因为它们根本不存在。您需要按照答案中提供的解决方案进行操作:cookie,查询字符串值+会话或仅查询字符串值,url重写(www.mysite.com/en/products) –

回答

2

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

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

+0

我可以在调试时看到,值确实是正确选择为“DE-DE”。即使它返回一个空字符串,为什么页面contentplaceholder中的内容不显示?我尝试过,将语言设置为空字符串,并且contentplaceholder的内容正确呈现。 – itsbalur

0

正如Doozer正确指出的那样,在InitializeCulture时控件不太可能设置正确的值。我会建议你在请求中读取来自POST数据的值,并通过一些默认值将其返回。例如,

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

为了访问MasterPage控件,最好使用MasterType指令。使用时,您将能够以强类型的方式访问母版页。在这种情况下,你就可以像这样创建母版页上的属性:

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

而且本身页面上,你就可以像这样运行代码:

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

}