2010-11-23 74 views
1

我在我的主母版頁中有以下佔位符。我不想在幾個內容頁面中複製我的新聞內容,所以我選擇不提供這些內容,並且母版頁應該提供它的默認值。何時加載主頁面上的默認內容

<asp:ContentPlaceHolder ID="SideBarContent" runat="server"> 
    <asp:GridView ID="newsGrid" runat="server" AutoGenerateColumns="false" Width="100%"> 
     <Columns> 
      <asp:TemplateField> 
       <ItemTemplate> 
       </ItemTemplate> 
      </asp:TemplateField> 
     </Columns> 
    </asp:GridView> 
</asp:ContentPlaceHolder> 

當我嘗試下面的代碼,我得到一個錯誤,因爲newsGrid爲null。我假設我在頁面生命週期的錯誤位置執行此操作,但我不知道正確的位置在哪裏。

protected void Page_Load(object sender, EventArgs e) 
{ 
    Page.Header.DataBind(); 
    if (!IsPostBack) 
    { 
     newsGrid.DataSource = _newsService.ListActive(); 
     newsGrid.DataBind(); 
    } 
} 
+0

您背後的代碼是在您的網頁上顯示的,還是在主頁上?我假設前者,但如果我錯了,不會回答。 – 2010-11-23 20:23:31

+0

@馬丁,一切都來自母版頁。 – ProfK 2010-11-23 20:30:49

回答

2

您的ContentPlaceHolder中的內容將被內容頁面提供的內容替換。

因此,當您的內容頁面具有以SideBarContent佔位符爲目標的Content控件時,您的newsGrid將被替換。

考慮到這一點,您是否在所有頁面上看到此問題,或者只是替換內容的頁面?我希望對於替換內容頁面中的內容的任何頁面,這個值爲空。

更新

我只是很快嘗試這樣做。

如果頁面沒有定義以asp:ContentPlaceHolder爲目標的asp:Content控件,那麼asp:ContentPlaceHolder中的控件將在後面的代碼中提供給您。

在它定義一個asp:Content靶向此asp:ContentPlaceHolder那麼asp:ConentPlaceHolder內部對照被除去,因此,空的代碼訪問後面時的頁面。

因此,當內容頁面提供內容時,主頁上佔位符內的這些內容將被替換,因此您的母版頁必須進行編碼以預期這種情況。

所以,如果你有這樣的的Site.Master:

<asp:ContentPlaceHolder ID="OtherContent" runat="server"> 
    <asp:Button ID="foo" runat="server" /> 
</asp:ContentPlaceHolder> 

...然後在Page1.aspx的你有這個...

​​

...那麼按鈕該頁面的「foo」將爲空。如果你忽略了這個Content控件是Page2.aspx,那麼按鈕foo將被實例化並且在你的主頁面代碼中可用。

protected void Page_Load(object sender, EventArgs e) 
{ 
    // this will be null for pages that 
    // remove the default content of "OtherContent" 
    var foo = this.foo; 
} 

所以,我懷疑你只需要防止這種網格是空,如果是,你可以假設內容頁面已經提供它自己的新聞列表。