假设我脑海中有下面的菜单图片。
根据上图,我创建了我的SQL CTE查询和该查询 返回下面的结果。
场景
方案是在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() %>
<%}%>
以上代码未显示期望的结果。它可以正确显示一级菜单,但不能显示子菜单。
我在代码中做错了什么,我找不到它。请帮助我。
答案 0 :(得分:0)
我相信我已经解决了所有问题,因此我将回答我自己的问题。看下面的代码。如果还有其他关于优化的修改,请告诉我。
输出
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>
<%
}
%>