我有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 ...
结果应如下所示:
Home Products Category 1 SubCategory 1 Third Level Category 1 SubCategory 2 Category 2 Services
理想情况下,列表也应该包含标签,但我希望如果我找到一种创建
列表的方法,我可以自己添加它.
编辑1:我认为已经有一个解决方案,但似乎没有.我希望尽可能保持简单,并且不惜任何代价逃避使用ASP.NET菜单,因为它默认使用表.然后我必须使用CSS Adapters等.
即使我决定沿着"ASP.NET菜单"路线走,我也只能找到这种方法:http://aspalliance.com/822,它使用DataAdapter和DataSet :(
更现代或更有效的方式?
使用linq2sql你可以这样做:
ListGetHierarchicalPages() { 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 parent, Func > setAndGetChildrenFunc) { foreach(var child in setAndGetChildrenFunc(parent)) { BuildTree(child, setAndGetChildrenFunc); } }
假设您在PageInfo中定义Pages属性,如:
public partial class PageInfo{ public ListPages{get;set;} }
在层次结构上获取它的处理发生在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();