代码之家  ›  专栏  ›  技术社区  ›  ProfK

何时加载母版页上的默认内容

  •  1
  • ProfK  · 技术社区  · 14 年前

    我的主页面中有以下占位符。我不想在多个内容页中复制我的新闻内容,因此我选择不在其中提供此内容,而母版页应提供其默认值。

    <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为空。我假设我在页面生命周期中的错误位置执行此操作,但我不知道正确的位置在哪里。

    protected void Page_Load(object sender, EventArgs e)
    {
        Page.Header.DataBind();
        if (!IsPostBack)
        {
            newsGrid.DataSource = _newsService.ListActive();
            newsGrid.DataBind();
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Martin Peck    14 年前

    ContentPlaceholder中的内容将替换为内容页提供的内容。

    因此,当内容页具有针对边栏内容占位符的内容控件时,将替换新闻网格。

    考虑到这一点,您是在所有页面上看到这个问题,还是只在替换内容的页面上看到这个问题?对于任何替换内容页中内容的页面,我都希望此值为空。

    更新

    我很快就试过了。

    使用不定义 asp:Content 控制目标 asp:ContentPlaceHolder 里面的控制 ASP:内容占位符 将在后面的代码中提供给您。

    在它确实定义了 ASP:内容 瞄准这个 ASP:内容占位符 然后里面的控制 asp:ConentPlaceHolder 因此,当在代码隐藏中访问时,将被删除,并为空。

    因此,当内容页提供内容时,母版页上占位符中的内容将被替换,因此必须对母版页进行编码,以期望出现这种情况。

    所以,如果您在site.master中有这个:

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

    …那么在page1.aspx中,你有这个……

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

    …那么该页面的按钮“foo”将为空。如果省略此内容控件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;
    }
    

    所以,我怀疑您只是需要防止这个网格为空,如果是,您可以假设内容页提供了自己的新闻列表。