Подпункты для управления сервером

#asp.net #custom-server-controls #servercontrols #web-controls

#asp.net #пользовательские серверные элементы управления #servercontrols #веб-элементы управления

Вопрос:

Я пытался создать серверный элемент управления. Я пытался заставить мой MenuItem содержать другие MenuItems в соответствии с этим следующим образом

 <cc1:DynamicMenu ID="DynamicMenu1" runat="server">
    <MenuItems>
        <cc1:MenuItem Text="" Url="">
            <cc1:MenuItem Text="" Url="">
                <cc1:MenuItem Text="" Url=""></cc1:MenuItem>
            </cc1:MenuItem>
            <cc1:MenuItem Text="" Url="">
                <cc1:MenuItem Text="" Url=""></cc1:MenuItem>
            </cc1:MenuItem>                
        </cc1:MenuItem>
    </MenuItems>
</cc1:DynamicMenu>
  

но мой код дает мне только это

 <cc1:DynamicMenu ID="DynamicMenu1" runat="server">
    <MenuItems>
        <cc1:MenuItem Text="" Url="">No other child elements for MenuItem</cc1:MenuItem>
    </MenuItems>
</cc1:DynamicMenu>
  

Я поиграл с ParseChildren и PersistChildren, заменив там значения true или false, и у меня закончились идеи
не мог бы кто-нибудь, пожалуйста, помочь мне решить мою проблему, ниже приведен мой код.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Security.Permissions;
using System.Collections;

namespace Gravity.Controls
{
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[ParseChildren(true), PersistChildren(true)]
[ToolboxData("<{0}:DynamicMenu runat="server"></{0}:DynamicMenu>")]    
public class DynamicMenu : WebControl
{
    public DynamicMenu()
    {

    }

    List<MenuItem> _menuItems;
    [PersistenceMode(PersistenceMode.InnerProperty)]          
    public List<MenuItem> MenuItems
    {
        get
        {
            if(_menuItems == null)
                _menuItems = new List<MenuItem>();
            return _menuItems;
        }
    }
}

[ParseChildren(false), PersistChildren(true)]    
public class MenuItem: INamingContainer
{
    private string _text;
    private string _url;

    public MenuItem(string text, string url)
    {

    }
    public MenuItem()
        : this("", "")
    {

    }

    public string Text
    {
        get
        {
            return _text;
        }
        set
        {
            _text = value;
        }
    }

    public string Url
    {
        get
        {
            return _url;
        }
        set
        {
            _url = value;
        }
    }

    private List<MenuItem> _subMenuItems;       
    public List<MenuItem> SubMenuItems
    {
        get
        {
            if (_subMenuItems == null)
                _subMenuItems = new List<MenuItem>();
            return _subMenuItems;
        }
    }
}
}
  

Комментарии:

1. Вы выяснили, как это сделать? У меня такая же проблема, но ни один из двух ответов не помог.

Ответ №1:

Вам необходимо динамически добавлять экземпляр вашего пользовательского элемента управления к самому себе в событии OnItemDataBound. Это будет повторяться до тех пор, пока не будет выполнено условие вашей бизнес-логики (т. Е. нет дочерних элементов, поэтому не добавляйте другой элемент управления) в OnItemDataBound.

Комментарии:

1. Можете ли вы отредактировать мой код и привести пример того, что он должен делать, потому что я не понимаю, о чем вы говорите

2. Не могу найти что-либо в Интернете в отношении методов, которые вы предложили мне использовать

Ответ №2:

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

 [ParseChildren(true), PersistChildren(false)]  
public class DynamicMenu 
  

и

 [ParseChildren(typeof(MenuItem), DefaultProperty = "SubMenuItems", ChildrenAsProperties = true)] 
public class MenuItem