如何使用ASP.Net中的递归生成动态菜单树?

时间:2018-08-19 14:33:15

标签: c# asp.net recursion tree

假设我脑海中有下面的菜单图片。

enter image description here

根据上图,我创建了我的SQL CTE查询和该查询 返回下面的结果。

enter image description here

场景

方案是在ASP.Net Webform应用程序中创建一个多级菜单。根据我过去的经验,我已经使用ASP.Net提供的站点地图和菜单控件创建了菜单。但是现在我想使用嵌入式代码块上的递归来创建自定义菜单。

我已经尝试过什么?

site.master.cs

public string recurseMenu(string ID = "0")
    {
        string s = "<ul id='ah-menu-level1'>";
        foreach (DataRow row in dtNavigation.Tables[0].Rows)
        {
            if (row["Root_Navigation_ID"].ToString() == ID)
            {
                s += "<li><a class='ah-anchor-tooltip-show' href='javascript:void(0)'> <i class='fa " + row["CSS_Class"].ToString() + " fa-lg' aria-hidden='true'></i></a><ul class='sub-menu'><li><a href='javascript:void(0)'><strong>" + row["Name"].ToString() + "</strong></a></li>";

                if (row["ID"].ToString() != "0")
                {
                    s += recurseMenu(row["ID"].ToString());
                }
                s += "</ul>";
            }
        }
        return s += "</ul>";
    }

site.master

<% if (dtNavigation.Tables.Count > 0){%>
<%= recurseMenu() %>
<%}%>

以上代码未显示期望的结果。它可以正确显示一级菜单,但不能显示子菜单。

我在代码中做错了什么,我找不到它。请帮助我。

1 个答案:

答案 0 :(得分:0)

我相信我已经解决了所有问题,因此我将回答我自己的问题。看下面的代码。如果还有其他关于优化的修改,请告诉我。

输出

enter image description here

site.master.cs

public string AddTopMenuItems(DataTable dt)
    {
        string dHTML = "";
        DataView DataView = new DataView(dt);
        DataView.RowFilter = "Root_Navigation_ID = 0";
        foreach (DataRowView GetParentRow in DataView) //Filter and Iterate on those rows in which root id is zero.
        {
            dHTML += "<li><a class='ah-anchor-tooltip-show' href='javascript:void(0)'><i class='fa " + GetParentRow["CSS_Class"].ToString() + " fa-lg' aria-hidden='true'></i></a>";
            dHTML += "<ul class='sub-menu'><li><a href='javascript:void(0)'><strong>" + GetParentRow["Name"] + "</strong></a>";
            NavigationItem item = new NavigationItem(GetParentRow["ID"].ToString(), GetParentRow["Root_Navigation_ID"].ToString(), GetParentRow["Name"].ToString());
            dHTML += AddChildMenuItems(dt, item);
            dHTML += "</li></ul></li>";
        }
        return dHTML;
    }

    private string AddChildMenuItems(DataTable dt, NavigationItem parentMenu)
    {
        EnumerableRowCollection<DataRow> GetChildrens = from getChilds in dtNavigation.Tables[0].AsEnumerable()
                                                        where getChilds.Field<Int64>("Root_Navigation_ID") == Convert.ToInt64(parentMenu.ID.ToString())
                                                        select getChilds; 
        DataView childs = GetChildrens.AsDataView();

        string retval = "";
        foreach (DataRowView child in childs)
        {
            NavigationItem subMenu = new NavigationItem(child["ID"].ToString(), child["Root_Navigation_ID"].ToString(), child["Name"].ToString());
            retval += "<ul><li><a href='javascript:void(0)'><strong>" + child["Name"].ToString().ToString() + "</strong></a>";
            retval += this.AddChildMenuItems(dt, subMenu);
            retval += "</li></ul>";
        }
        return retval;
    }

site.master

<% if (dtNavigation.Tables.Count > 0)
    { 
%>
        <ul id="menu">
        <%= AddTopMenuItems(dtNavigation.Tables[0]) %>
        </ul>
<% 
    } 
%>