Управляемое базой данных вложенное меню в ASP.Net LINQ - PullRequest
0 голосов
/ 31 декабря 2011

Привет, я пытаюсь решить эту проблему, я беру данные из БД и создаю меню:

  if (Context.User.IsInRole("Admin") == true)
  {


                mnMenu.Items.Clear();
                List<menuRole> menuParentList = new List<menuRole>();
                List<MenuItem> menuItemList = new List<MenuItem>();
                List<MenuItem> hoverItem = new List<MenuItem>();
                int parentPosition = 0;
                string menuName;

                menuParentList = roles.getMenuItems().ToList();

                for (int i = 0; i < menuParentList.Count; i++)
                {
                    if (menuParentList[i].menuType == "Admin")
                    {
                        if (menuParentList[i].MenuRole1 == "parent")
                        {
                            menuName = menuParentList[i].menuName.ToString();
                            menuItemList[i].Text = menuName;
                            parentPosition = i;
                        }
                        else if (menuParentList[i].MenuRole1 == "child")
                        {
                           hoverItem[i].Text = menuParentList[i].menuName;
                           hoverItem[i].NavigateUrl = menuParentList[i].MenuLink;
                           menuItemList[i].ChildItems.Add(hoverItem[i]);
                        }
                    }
                }
                mnMenu.Items.Add(menuItemList[0]);
                mnMenu.Items.Add(menuItemList[1]);
                mnMenu.Items.Add(menuItemList[2]);

      }

теперь это дает мне исключение на данный момент:

System.ArgumentOutOfRangeException was unhandled by user code
  Message=Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
  Source=mscorlib
  ParamName=index
  StackTrace:
       at System.ThrowHelper.ThrowArgumentOutOfRangeException()
       at System.Collections.Generic.List`1.get_Item(Int32 index)
       at PresentationLayer.UserControls.Menu.Page_Load(Object sender, EventArgs e) in C:\Users\Kurt\documents\visual studio 2010\Projects\aaa\PresentationLayer\UserControls\Menu.ascx.cs:line 44
       at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
       at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
       at System.Web.UI.Control.OnLoad(EventArgs e)
       at System.Web.UI.Control.LoadRecursive()
       at System.Web.UI.Control.LoadRecursive()
       at System.Web.UI.Control.LoadRecursive()
       at System.Web.UI.Control.LoadRecursive()
       at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
  InnerException: 

1 Ответ

1 голос
/ 31 декабря 2011

Что ж, похоже, здесь делается несколько (слишком много) предположений:

  mnMenu.Items.Add(menuItemList[2]);

Вам следует проверить, сколько предметов вы получили.


if (menuParentList[i].MenuRole1 == "parent")
{
  menuName = menuParentList[i].menuName.ToString();
  menuItemList.Add(new MenuItem());  // add this 
  menuItemList[i].Text = menuName;
  parentPosition = i;
}

И то же самое для HoverItem.


Изменить, принять 3.

Вы не можете использовать i для индексации menuList и hoverItemколлекции, они не растут на каждом шагу.

    if (menuParentList[i].MenuRole1 == "parent")
    {
        menuName = menuParentList[i].menuName.ToString();
        var newItem = new MenuItem();
        newItem.Text = menuName;
        menuItemList.Add(newItem);                             
        parentPosition = menuItemList.Count-1;   // flaky
    }
    else if (menuParentList[i].MenuRole1 == "child")
    {
        var newItem = new MenuItem();
        newItem.Text = menuParentList[i].menuName;
        newItem.NavigateUrl = menuParentList[i].MenuLink;
        hoverItem.Add(newItem);                             

        //menuItemList[i].ChildItems.Add(hoverItem[i]);
        menuItemList[parentPosition].ChildItems.Add(newItem);  // I think
    }
...