2010-11-23 6 views
1

J'ai l'espace réservé suivant dans ma page principale. Je souhaite ne pas avoir à dupliquer le contenu de mes nouvelles sur plusieurs pages de contenu. J'ai donc choisi de ne pas fournir ce contenu, et la page maître devrait fournir sa valeur par défaut.Quand charger le contenu par défaut sur une page maître?

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

Lorsque je tente le code suivant, je reçois une erreur parce que newsGrid est nulle. Je suppose que je fais cela au mauvais endroit dans le cycle de vie de la page, mais je ne sais pas où est le bon endroit.

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

Le code derrière vous s'affiche-t-il ici sur l'une de vos pages ou sur la page maître elle-même? Je suppose le premier, mais je ne répondrai pas au cas où je me trompe. –

+0

@martin, tout est à partir de la page maître. – ProfK

+0

Etes-vous sûr qu'un contrôle utilisateur n'est peut-être pas la meilleure solution pour cela? – Jess

Répondre

2

Le contenu entre votre ContentPlaceHolder sera remplacé par le contenu fourni par la page de contenu. Ainsi, lorsque votre page de contenu a un contrôle de contenu qui cible l'espace réservé SideBarContent, votre newsGrid sera remplacé.

Dans cette optique, voyez-vous ce problème sur toutes les pages, ou seulement sur les pages qui remplacent le contenu? Je m'attendrais à ce que ce soit null pour n'importe quelle page où vous remplacez le contenu dans une page de contenu.

mise à jour

Je viens rapidement essayé cela.

Avec une page qui ne définit pas un contrôlequi cible le asp:ContentPlaceHolder les contrôles à l'intérieur de ce asp:ContentPlaceHolder seront disponibles dans le code derrière.

Dans une page où il est défini un asp:Content ce asp:ContentPlaceHolder alors ciblant les contrôles à l'intérieur que asp:ConentPlaceHolder sont supprimés et, par conséquent, nulle quand on y accède dans le code derrière. Par conséquent, ce contenu dans l'espace réservé de la page maître sera remplacé lorsqu'une page de contenu fournit du contenu, et que votre page maître doit être codée pour attendre cette situation.

Donc, si vous avez cela dans le Site.master:

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

... puis à Page1.aspx vous avez cette ...

<asp:Content ID="Content1" runat="server" ContentPlaceHolderID="OtherContent"> 
</asp:Content> 

... puis sur le bouton "foo" sera null pour cette page. Si, vous omettez ce contrôle de contenu est Page2.aspx, le bouton foo sera instancié et disponible dans votre code masterpage derrière.

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

Donc, je suppose que vous avez simplement besoin de se prémunir contre cette grille étant nulle et si elle est vous pouvez supposer la page de contenu a fourni sa propre liste de nouvelles.

+0

Merci, certaines nouvelles ce soir sont bonnes. – ProfK

Questions connexes