ASP.NET MVC 3 вложенных списка - PullRequest
1 голос
/ 23 ноября 2011

Я новичок в мире MVC и нуждаюсь в руководстве.Я пытаюсь создать вертикальное многоуровневое меню для веб-сайта.Данные для меню хранятся в таблице базы данных со следующей структурой:

ID, categoryName, parentID

Как мне поступить с обычными ADO.NET и MVC?Насколько я могу судить, мне нужно создать класс MenuItem со свойствами int ID, string name и List<MenuItem> Children.Затем мне нужно сделать и экземпляр этого класса, представляющий вертикальное меню, а затем мне нужно сгенерировать HTML для представления.

Я искал в сети простой пример, но не нашел ничего, что смог бы понять.Если есть кто-нибудь, кто может мне в этом помочь, это будет очень ценить!

1 Ответ

2 голосов
/ 24 ноября 2011

Вы должны отредактировать свой вопрос или разбить его на более конкретные вопросы.

Я отвечу на конкретный вопрос в вашем комментарии о том, как рекурсивно загружать ваши MenuItems.

Вы написали, что используете обычный ADO.NET. Я мог свободно использовать dapper в моем примере кода, который немного облегчает жизнь:

Так вот вам класс MenuItem:

public class MenuItem
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public List<MenuItem> Children { get; set; }
}

Теперь мы открываем соединение и загружаем всю таблицу MenuItems в одну коллекцию:

SqlConnection conn = new SqlConnection("...");
conn.Open();
IEnumerable<MenuItem> allItems = conn.Query<MenuItem>("SELECT * FROM MenuItems");

Я предполагаю, что у вас будет один элемент MenuItem в качестве корневого элемента с ParentId = null. Давайте найдем это:

MenuItem rootMenu = allItems.Single(m => m.ParentId == null);

Последнее, что нам нужно сделать, - это переставить элементы в иерархическом дереве. Мы делаем это с помощью функции, которая работает рекурсивно:

loadChildren(rootMenu, allItems);

Вот функция. Он просто ищет дочерние элементы переданного элемента и вызывает себя на всех найденных дочерних узлах:

private static void loadChildren(MenuItem currentItem, 
                                IEnumerable<MenuItem> allItems)
{
    currentItem.Children = allItems
                             .Where(m => m.ParentId == currentItem.Id).ToList();
    foreach (var childItem in currentItem.Children)
    {
        loadChildren(childItem, allItems);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...