从分层sql数据返回无序列表

Mil*_*lan 2 html asp.net sql-server-2005

我有pageId,parentPageId,标题列的表.

有没有办法使用asp.net,cte,存储过程,UDF返回无序嵌套列表......什么?

表看起来像这样:

PageID    ParentId    Title
1         null        Home
2         null        Products
3         null        Services
4         2           Category 1
5         2           Category 2
6         5           Subcategory 1
7         5           SubCategory 2
8         6           Third Level Category 1
...  
Run Code Online (Sandbox Code Playgroud)

结果应如下所示:

Home
Products
    Category 1
        SubCategory 1
            Third Level Category 1
        SubCategory 2
    Category 2
Services
Run Code Online (Sandbox Code Playgroud)

理想情况下,列表也应该包含<a>标签,但我希望如果我找到一种创建<ul>列表的方法,我可以自己添加它.

编辑1:我认为已经有一个解决方案,但似乎没有.我希望尽可能保持简单,并且不惜任何代价逃避使用ASP.NET菜单,因为它默认使用表.然后我必须使用CSS Adapters等.

即使我决定沿着"ASP.NET菜单"路线走,我也只能找到这种方法:http://aspalliance.com/822,它使用DataAdapter和DataSet :(

更现代或更有效的方式?

egl*_*ius 5

使用linq2sql你可以这样做:

List<PageInfo> GetHierarchicalPages()
{
   var pages = myContext.PageInfos.ToList();
   var parentPages = pages.Where(p=>p.ParentId == null).ToList();
   foreach(var page in parentPages)
   {
      BuildTree(
        page, 
        p=> p.Pages = pages.Where(child=>p.pageId == child.ParentId).ToList()
        );
   }
}
void BuildTree<T>(T parent, Func<T,List<T>> setAndGetChildrenFunc)
{
   foreach(var child in setAndGetChildrenFunc(parent))
   {
       BuildTree(child, setAndGetChildrenFunc);
   }
}
Run Code Online (Sandbox Code Playgroud)

假设您在PageInfo中定义Pages属性,如:

public partial class PageInfo{
   public List<PageInfo> Pages{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在层次结构上获取它的处理发生在Web应用程序端,这避免了sql server上的额外负载.另请注意,此类信息是缓存的理想选择.

您可以像雷克斯提到的那样进行渲染.或者,您可以在此实现上进行一些扩展,并使其支持层次结构接口并使用asp.net控件.

更新1:对于您在评论中询问的渲染变体,您可以:

var sb = new System.IO.StringWriter();
var writer = new HtmlTextWriter(sb);
// rex's rendering code
var html = sb.ToString();
Run Code Online (Sandbox Code Playgroud)