ContentPlaceHolders: повторяющийся контент - PullRequest
10 голосов
/ 17 апреля 2009

Сценарий

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

Мастер страница
<html>
  <body>
    <asp:ContentPlaceHolder ID="Foo" runat="server">
    </asp:ContentPlaceHolder>
    <!-- page content -->
    <asp:ContentPlaceHolder ID="Bar" runat="server">
    </asp:ContentPlaceHolder>
  </body>
</html>
Страница содержания
<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
  <!-- content -->
</asp:Content>
<asp:Content ID="Bottom" ContentPlaceHolderID="Bar" runat="server">
  <!-- content repeated -->
</asp:Content>

Техническое обслуживание

Как вы знаете, повторять вещи в коде обычно нехорошо. Это создает проблемы с обслуживанием. Вот что я хотел бы сделать, но, очевидно, не будет работать из-за повторяющегося атрибута id:

Мастер страница
<html>
  <body>
    <asp:ContentPlaceHolder ID="Foo" runat="server">
    </asp:ContentPlaceHolder>
    <!-- page content -->
    <asp:ContentPlaceHolder ID="Foo" runat="server">
    </asp:ContentPlaceHolder>
  </body>
</html>
Страница содержания
<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
  <!-- content (no repetition) -->
</asp:Content>

возможно?

Есть ли способ сделать это с помощью веб-форм asp.net? Решение не обязательно должно напоминать вышеуказанный контент, оно просто должно работать так же.

Примечания

Я использую asp.net 3.0 в Visual Studio 2008

Ответы [ 5 ]

6 голосов
/ 03 октября 2009

Эй, если кому-то все еще нужно решение для этого, вот что я сделал: Поместите его в файл кода вашей главной страницы

protected override void RenderChildren(HtmlTextWriter writer)
{
    Control mainPlaceHolder = FindControl("MainContentPlaceHolder");
    Control doublePlaceHolder = FindControl("ContentDoublePlaceHolder");

    StringBuilder sb = new StringBuilder();

    using (StringWriter sw = new StringWriter(sb))
    using (HtmlTextWriter tw = new HtmlTextWriter(sw))
    {
        mainPlaceHolder.RenderControl(tw);
    }

    LiteralControl lc = new LiteralControl(sb.ToString());
    doublePlaceHolder.Controls.Add(lc);

    base.RenderChildren(writer);
}

Я не уверен насчет проблем с производительностью, но это, безусловно, работает.

5 голосов
/ 31 августа 2009

В случае, когда вы просто хотите повторить строку, это сработало для меня:

<asp:ContentPlaceHolder ID="TitleContent" runat="server" /> 

В других местах можно ссылаться как:

<%  Dim title As LiteralControl = TitleContent.Controls.Item(0)
    Response.Write(title.Text)
%>

Нет гарантии, что это правильный курс действий :)

3 голосов
/ 17 апреля 2009

Как уже говорили другие, в зависимости от самого контента существуют ярлыки, которые можно использовать в зависимости от типа контента, который там будет.

Однако, если вам нужно, чтобы "контент" был полностью функционирующим кодом asp.net, я бы предложил UserControl для каждой ContentPage, которая содержит сам контент, а затем вам нужно дублировать только одну строку кода.

Пример

Мастер-страница

<html>
    <body>
        <asp:ContentPlaceHolder ID="Foo" runat="server">
        </asp:ContentPlaceHolder>
        <!-- page content -->
        <asp:ContentPlaceHolder ID="Bar" runat="server">
        </asp:ContentPlaceHolder>
    </body>
</html>

Страница содержания

<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server">
    <uc1:Page1Control id="page1Control1" runat="server" />
</asp:Content>
<asp:Content ID="Bottom" ContentPlaceHolderID="Bar" runat="server">
    <uc1:Page1Control id="page1Control2" runat="server" />
</asp:Content>
1 голос
/ 17 апреля 2009

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

0 голосов
/ 17 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...