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 :(
更现代或更有效的方式?
使用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)
| 归档时间: |
|
| 查看次数: |
4113 次 |
| 最近记录: |