повторение тех же вложенных тегов в пользовательском элементе управления - PullRequest
0 голосов
/ 08 ноября 2019

Я попытался создать пользовательский элемент управления, подобный этому:

<mc:Menu runat="server">
    <MenuItem> markup, controls, etc  </MenuItem>
    <MenuItem> markup, controls, etc  </MenuItem>
     ...
    <MenuItem> markup, controls, etc </MenuItem>
</mc:Menu>

Здесь я рассмотрел множество примеров, и все, что я придумал, это только явно не лучший код:

<%-- markup, controls, etc --%>
<asp:Repeater ID="repMenu" runat="server">
    <ItemTemplate>
        <asp:PlaceHolder runat="server"><%# attachContent((ITemplate)Container.DataItem, Container.Controls[1]) %></asp:PlaceHolder>
    </ItemTemplate>
</asp:Repeater>
<%-- markup, controls, etc --%>
public partial class MenuUserControl : System.Web.UI.UserControl
{
    private List<ITemplate> listMenuItem = new List<ITemplate>(); 

    [PersistenceMode(PersistenceMode.InnerProperty), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public virtual ITemplate MenuItem 
    { 
        get { throw new InvalidOperationException("MenuItem.get"); } 
        set { listMenuItem.Add(value); } 
    }

    protected virtual object attachContent(ITemplate template, Control control)
    {
        template.InstantiateIn(control);
        return null;
    }

    protected override void CreateChildControls()
    {
        base.CreateChildControls();
        this.EnsureChildControls();

        repMenu.DataSource = listMenuItem;
        repMenu.DataBind();
    }

} 

использование:

<mc:Menu runat="server">
    <MenuItem><%= "abc" %></MenuItem>
    <MenuItem><%= "123" %></MenuItem>
</mc:Menu>

Есть ли лучший способ реализовать пользовательский контроль, подобный этому?

И еще два вопроса относительно моего кода.

  1. Содержимое MenuItem обязательно должно содержать блок кода, в противном случае выдается исключение System.Web.HttpException: коллекцию элементов управления нельзя изменить на этапах DataBind, Init, Load, PreRender или Unload. Причина исключения понятна. Но почему блок кода предотвращает исключение?

  2. Есть ли способ получить родительский контроль из блока кода внутри asp:Repeater/ItemTemplate вместо грубого Container.Controls[1].

...