#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