Если вы можете вывести свое меню в виде списка MenuItem
объектов, каждый из которых имеет (иногда пустой) список подпунктов (и я действительно имею в виду List<MenuItem>
здесь ... мы Если вы собираетесь использовать эту коллекцию в качестве источника данных для суб-повторителя, поэтому ему необходимо реализовать IEnumerable<T>
) как свойство MenuItem.SubItems
, вы, вероятно, можете использовать UserControl
, который зацикливает один уровень меню и вызывает сам на следующий.
В UserControl
у вас будет что-то вроде этого:
<li><a href='<%= this.MenuItem.Url %>'><%= this.MenuItem.LinkText %></a></li>
<asp:Repeater ID="UCRepeater" runat="server">
<HeaderTemplate>
<ul>
<ItemTemplate>
<menu:MenuItem ID="MenuItemUC" runat="server" />
</ItemTemplate>
<FooterTemplate>
</ul>
</FooterTemplate>
</asp:Repeater>
UserControl
в ItemTemplate
- то же самое, поэтому для каждого шаблона элемента будет отображаться одно и то же.
Ниже приведен код для этого пользовательского элемента управления, и здесь происходит волшебство:
public partial class MenuItemUserControl : UserControl
{
// A property we'll use as the data source
public MenuItem MenuItem { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
// If the current menu item has sub items, we bind the repeater to them
// And by the way, there is no use doing this on every postback. First
// page load is good enough...
if(!Page.IsPostBack) {
{
if(MenuItem.SubItems.Count > 0)
{
UCRepeater.DataSource = MenuItem.SubItems;
UCRepeater.DataBind();
}
}
}
protected void UCRepeater_OnItemDataBound(object sender,
RepeaterDataBoundEventArgs e)
{
// Every time an Item is bound to the repeater, we take the current
// item which will be contained in e.DataItem, and set it as the
// MenuItem on the UserControl
// We only want to do this for the <ItemTemplate> and
// <AlternatingItemTemplate>
if(e.Item.ItemType == ListItemType.Item ||
e.Item.ItemType == ListItemType.AlternatingItem)
{
var uc = (MenuItemUserControl)e.Item.FindControl("MenuItemUC");
if(uc != null)
{
// This is the magic. Abrakadabra!
uc.MenuItem = (MenuItem)e.DataItem;
}
}
}
}
Итак, чтобы заставить это работать, единственное, чего не хватает - это действительно хороший способ вывести ваши данные в виде иерархического списка MenuItem
с. Это я оставлю на вашем уровне доступа к данным (и было бы легко легко использовать LINQ to SQL или Entity Framework ...;))
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Этот код предоставляется как есть, и я написал его на макушке. Я не проверял это, но я думаю, что это будет работать - и если это не сработает, это может, по крайней мере, дать вам представление о том, как решить проблему. Если у вас есть проблемы, пожалуйста, оставьте их в комментариях, и я постараюсь помочь - но здесь нет никаких обещаний успеха. Просто готовность помочь! =) * +1022 *