请帮我解决我的大问题。
在我的在线购物项目中,我创建了一个动态类别列表(具有无限级别深度)在具有自联接的DB中的单个表中实现。
架构如下:
alt text http://aspalliance.com/ArticleFiles/822/image002.gif
更新
我想使用JQuery插件制作多级菜单栏。此插件使用<ul>
和<li>
元素,因此我应将数据库表格转换为<ul>
和<li>
。结果应该是这样的:
<ul>
<li>Clothing 1
<ul>
<li>Trousers 2
<ul>
<li>Mens trousers 3</li>
<li>Ladies trousers 3</li>
</ul>
</li>
<li>Jackets 2</li>
<li>Shirts 2</li>
<li>Shoes
<ul>
<li>Mens shoes 3
<ul>
<li>Mens formal shoes 4</li>
<li>Mens casual shoes 4</li>
</ul>
</li>
<li>Kids shoes 3</li>
<li>Ladies shoes 3</li>
</ul>
</li>
</ul>
</li>
<li>Cars 1
<ul>
<li>Small cars 2</i>
</ul>
</li>
</ul>
我可以使用嵌套数据控件(如转发器控件)但是你知道,通过这个解决方案,我可以实现一个具有非无限分层树结构的列表。
请帮帮我!任何建议?我用谷歌搜索网络,但找不到合适的方式。我使用 ASP.net 3.5和LINQ 。
什么是最好的方式?
答案 0 :(得分:10)
使用此递归方法
private string GenerateUL(IQueryable<Menu> menus)
{
var sb = new StringBuilder();
sb.AppendLine("<ul>");
foreach (var menu in menus)
{
if (menu.Menus.Any())
{
sb.AppendLine("<li>" + menu.Text);
sb.Append(GenerateUL(menu.Menus.AsQueryable()));
sb.AppendLine("</li>");
}
else
sb.AppendLine("<li>" + menu.Text + "</li>");
}
sb.AppendLine("</ul>");
return sb.ToString();
}
像这样
DataClasses1DataContext context = new DataClasses1DataContext();
var s = GenerateUL(context.Menus.Where(m => m.ParentID == null));
Response.Write(s);
答案 1 :(得分:0)
我认为ASP.NET TreeView
是你的朋友。
看看here。
此外,您可能希望使用动态创建的嵌套DataGrid或Repeater,这是一个示例(您可以将其设置为动态,因此嵌套(甚至是父)中继器将以编程方式生成。
void GenerateChildren(Menu menu)
{
//Create DataGridRow/RepeaterRow/TreeViewNode/whatever for this menu
menu.Children.Load();
foreach (var child in menu.Children)
{
GenerateChildren(child);
}
}
<强>更新强> 请参阅this页面上的示例5。 我建议按服务器生成jQuery代码,这样你就可以更容易地控制菜单和jQ生成的菜单。