Как я могу сложить неизвестное количество повторителей ASP.NET? - PullRequest
0 голосов
/ 31 мая 2009

Я создаю всплывающее меню, и клиент хочет, чтобы оно могло отображаться постоянно в зависимости от иерархии.

Например, первая панель представляет собой список параметров. Когда они наведены, рядом с ней должна появиться другая панель со следующим уровнем параметров и так далее, пока не будет достигнут последний уровень параметров.

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

Мне нужно иметь возможность постоянно вставлять повторители для каждого уровня параметров или достигать этого с помощью аналогичной техники с использованием другого элемента управления.

Любая помощь отличная, спасибо!

Ответы [ 2 ]

0 голосов
/ 31 мая 2009

Если вы можете вывести свое меню в виде списка 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 *

0 голосов
/ 31 мая 2009

Вы не сможете встроить это в разметку. Вам придется динамически добавлять элементы управления в свой код, создавая повторитель для каждого уровня и добавляя его в предыдущий шаблон повторителя. Для каждой выбранной опции потребуется полная обратная передача, поскольку вложенный репитер может иметь разную глубину в зависимости от того, какая опция выбрана.

Возможно, вам лучше сделать все это на стороне клиента, используя AJAX и javascript. Когда опция выбрана, запустите AJAX-запрос, чтобы увидеть, есть ли у этой опции подопции. Если это произойдет (верните их), то динамически создайте новый элемент управления параметрами с помощью javascript и добавьте его на страницу. Когда будет выбран другой параметр, вы удалите элементы из DOM, содержащие ранее выбранные дополнительные параметры.

...