Когда загружать содержимое по умолчанию на главной странице - PullRequest
1 голос
/ 23 ноября 2010

У меня есть следующий заполнитель на главной странице.Я не хотел бы дублировать свой новостной контент на нескольких контентных страницах, поэтому я решил просто не предоставлять этот контент на них, а на главной странице должно быть указано его значение по умолчанию.

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

1 Ответ

2 голосов
/ 23 ноября 2010

Содержимое в вашем ContentPlaceHolder будет заменено содержимым, предоставленным страницей содержимого.

Таким образом, когда ваша страница контента имеет элемент управления контентом, предназначенный для заполнителя SideBarContent, ваша новостная сетка будет заменена.

Имея это в виду, видите ли вы эту проблему на всех страницах или только на страницахчто заменить контент?Я ожидаю, что это будет нулевым для любой страницы, где вы заменяете контент на странице контента.

update

Я только что быстро попробовал это.

Со страницей, которая не определяет элемент управления asp:Content, нацеленный на asp:ContentPlaceHolder элементы управления внутри этого 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 у вас есть это ...

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

Итак, я подозреваю, что вам просто нужно принять меры, чтобы эта сетка была нулевой иесли это так, вы можете предположить, что на содержательной странице есть собственный список новостей.

...