2010-11-23 7 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

あなたのページの裏にあるコードは、あなたのページの1つ、またはマスターページ自体に表示されていますか?私は前者と仮定していますが、私が間違っている場合には答えません。 –

+0

@martin、すべてマスターページからです。 – ProfK

+0

あなたはこれに対してより良い解決策ではないと確信していますか? – Jess

答えて

2

ContentPlaceHolder内のコンテンツは、コンテンツページで提供されるコンテンツに置き換えられます。

コンテンツページにSideBarContentプレースホルダをターゲットとするコンテンツコントロールがある場合、newsGridが置き換えられます。

この点を念頭に置いて、この問題はすべてのページに表示されるのでしょうか、コンテンツに置き換わるページだけが表示されていますか?これは、コンテンツページのコンテンツを置き換えるページではnullになると考えられます。私はすぐにこれを試してみた

更新

asp:ContentPlaceHolderを対象とするコントロールasp:Contentを定義しているページでは、その中のコントロールasp:ContentPlaceHolderがコードの背後に表示されます。

asp:Contentがこのasp:ContentPlaceHolderを対象としているページでは、asp:ConentPlaceHolderのコントロールが削除されているため、コードの背後でアクセスするとnullになります。

したがって、コンテンツページでコンテンツが提供されると、このマスターページのプレースホルダ内のコンテンツが置き換えられます。そのため、マスターページにこのような状況が想定されるようにコーディングする必要があります。その後、

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

...その後Page1.aspxにあなたがこれを持っている...

​​

...ボタン:だから

、あなたはSite.masterでこれを持っている場合そのページの "foo"はnullになります。この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; 
} 

だから、私はあなたが単にヌルされ、このグリッドを防ぐために必要がある疑いがあるとそれがある場合は、コンテンツページは、それ自身のニュースのリストを提供していると仮定することができます。

+0

ありがとう、今夜のニュースが良いです。 – ProfK

関連する問題