2009-10-20 133 views
2

當使用母版頁的頁面沒有針對母版頁的一個ContentPlaceHolders的asp:Content控件時,將顯示默認內容。我想在有一個asp:該ContentPlaceHolder的內容控件的頁面上使用該默認內容。使用ContentPlaceHolder的默認內容而不是頁面內容

在使用主頁面的頁面中,我想在代碼中決定是使用默認內容還是使用頁面特定的內容。如何顯示來自母版頁的默認內容,而不是來自ContentPlaceHolderID的asp:Content控件的內容?

例如,假設我有一個用於菜單的ContentPlaceHolder。默認內容顯示一個基本菜單。該頁面從查詢構建菜單,但如果查詢沒有結果,我想顯示默認菜單。默認情況下,將顯示空的asp:Content控件。我如何獲取母版頁的默認內容?

回答

1

我想出的最佳方法是不要在ContentPlaceHolder中使用默認內容。相反,我加入一個佔位符相鄰的ContentPlaceHolder默認內容:

<asp:ContentPlaceHolder ID="Menu" runat="server" /><!-- no default content --> 
<asp:PlaceHolder runat=server ID="DefaultContentForMenu" Visible=false 
    EnableViewState=false >Default menu content here</asp:PlaceHolder> 

然後我添加了一個ForceDefaultContentForMenu屬性母版頁,以便使用該母版頁頁可以指定默認的內容應該甚至用如果該頁面提供自己的內容。

主網頁的渲染方法顯示默認的內容,如果ForceDefaultContentForMenu屬性爲true或內容佔位符是空的:使用母版頁會得到默認默認內容

protected override void Render(HtmlTextWriter writer) 
{ 
    if (ForceDefaultContentForMenu || !Menu.HasControls()) 
    { 
     Menu.Controls.Clear(); 
     DefaultContentForMenu.Visible = true; 
    } 
    base.Render(writer); 
} 

現在的網頁,如果他們不爲菜單內容佔位符添加自己的內容,但可以指定應使用默認內容而不是自己的內容。

我發現這種方法唯一的缺點是,當Visual Studio將內容區域添加到頁面時,不會複製默認內容。對於我所做的工作,這是一個好處,而不是缺點,因爲如果我將內容區域添加到頁面,這是因爲我不需要默認內容。

3

一種方法是清除Page_Load中佔位符內容的控件集合並添加更新的菜單。

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(needsBetterMenu) 
    { 
     ContentPlaceHolder holder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1"); 
     holder.Controls.Clear(); 
     holder.Controls.Add(betterMenu); 
    } 
} 
+0

應該可能在Init而不是Page_Load中做到這一點,以便在betterMenu上獲得事件觸發。 – Bryan 2009-10-20 23:32:33

+0

我會記住這個提示。是的,如果需要,最好在初始階段添加控制權併爲生命週期事件註冊。 – terR0Q 2009-11-19 19:21:19

+1

這假定使用母版頁的頁面沒有ContentPlaceHolder1的asp:Content控件。我想找到一種方法來訪問默認內容,即使添加了asp:Content。 – 2009-11-19 19:36:32

0

如果不斷變化的母版頁中的內容在代碼中的子頁面的背後你的罰款,你可以做到以下幾點:

添加中用runat =「服務器」的HTML控件中要編輯母版頁:

的Site.Master

... 
<ul id="menu" runat="server"> 
    <li><a href="#">Link 1</a></li> 
    <li><a href="#">Link 2</a></li> 
</ul> 
... 

然後在需要更改的菜單內容的子頁面背後的代碼,把下面的代碼:

protected void Page_Load(object sender, EventArgs e) 
    { 
     HtmlGenericControl c = Master.FindControl("menu") as HtmlGenericControl; 

     if (c != null) 
     { 
      c.Controls.Clear(); 
      c.Controls.Add(new HtmlGenericControl("li") { InnerHtml = "<a href=\"#\">Link 3</a>" }); 
     } 
    } 

或任何你想放在菜單控件中的html。

沒有代碼將輸出下面的HTML的頁面:

<ul id="ctl00_menu"> 
    <li><a href="#">Link 1</a></li> 
    <li><a href="#">Link 2</a></li> 
</ul> 

並用代碼顯示如下頁面:

<ul id="ctl00_menu"> 
    <li><a href="#">Link 3</a></li> 
</ul> 

顯然你不希望使用此代碼原樣。這只是一個原型。我會重構它以允許將內容添加到任何控件並將其投入到所有頁面將繼承的基本頁面類中。

相關問題