Добавить дочерние элементы управления в теги ServerControl? - PullRequest
2 голосов
/ 10 ноября 2010

Я работаю над меню навигации.
Я создал ниже ServerControl, и он работает, но я хочу позволить пользователям добавлять некоторые стандартные элементы управления ASP.NET в мои теги ServerControl, например label, image и т.

<MdsMenu:ServerControlMenu ID="ServerControlMenu1" runat="server">
  <MdsMenu:animation AnimationSpeed="Normal" AnimationType="Opacity_Height" Delay="1000" DropShadow="true" />
    <!-- HERE HAS TO HAVE SOME STANDARD ASP.NET CONTROLS -->
    <!-- e.g <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> -->
  </MdsMenu:MenuItem>
</MdsMenu:ServerControlMenu>

Моя проблема здесь в том, как я могу получить дочерние элементы управления в <MdsMenu:MenuItem> и показать их как они есть в выводе.

P.S .:
Я перезаписываю RenderContents метод

protected override void RenderContents(HtmlTextWriter output)
{ 
   output.Write(OutPutStringBuilder.ToString()); 
}

Ответы [ 2 ]

10 голосов
/ 15 ноября 2010

Я думаю, вам просто нужно добавить [ParseChildren(false), PersistChildren(true)] в класс, представляющий тег <MdsMenu:MenuItem/>. Дочерние элементы управления, записанные внутри тега, должны быть доступны во время выполнения в свойстве Controls элемента управления.

ОБНОВЛЕНИЕ: Я собрал быстрый тестовый проект, чтобы продемонстрировать, что это действительно работает. (Очевидно, людям нравится понижать голосование, фактически не оценивая, является ли ответ правильным.)

Этот пользовательский элемент управления имеет ожидаемое поведение:

[ParseChildren(false), PersistChildren(true)]
public partial class SuperDiv : System.Web.UI.UserControl
{
    public override void RenderControl(HtmlTextWriter writer)
    {
        writer.Write("<div class=\"super\">");
        writer.Write(Controls.Count);

        foreach (Control i in Controls)
            i.RenderControl(writer);

        writer.Write("</div>");
    }
}

Итак, следующая разметка ASP.NET:

<test:SuperDiv runat="server">
    <asp:Label runat="server">Hello, World!</asp:Label>
</test:SuperDiv>

Результатом будет следующий HTML-код:

<div class="super">3
    <span>Hello, World!</span>
</div>

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

1 голос
/ 16 ноября 2010

вам нужно, чтобы ваш веб-элемент управления действовал как контейнер (например, элемент управления панели)

, просто добавьте атрибуты, показанные ниже, в свой класс веб-управления

 [ParseChildren(false)]
    [PersistChildren(true)]
    [Designer(typeof(PanelDesigner))] 
    public class MyOwnControl:WebControl
    {




    }

, затем на.aspx странице вы сможете сделать следующее:

 <cc1:MyOwnControl ID="MyOwnControl1" runat="server">
        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    </cc1:MyOwnControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...