2010-10-22 109 views
0

我最近遇到了一个奇怪的问题。我有一个名为Task的数据库表。一个任务可能有一个父任务和多个子任务(自加入)。我编写了一个存储过程,使用CTE(公用表表达式)将项目中的所有任务返回给子项和子级达到n级。我要求的结果如下alt textasp.net mvc递归html递归

结果成功实现。您可以在第一列中看到缩进以显示层次关系。问题在于我是以一种“不好的方式”来做的。下面是我的看法代码

<table cellspacing="0"> 
    <%foreach (var it in Model.list.Where(x=>x.ParentID == null)) 
     { 
      int x = 1;%> 

     <tr> 
      <td width="150"><div class="wrapper" style="width:18px;">&nbsp;</div><%:it.TOC %></td> 
      <td><%:it.label %></td> 
      <td><%:it.StartDate%></td> 
      <td><%:it.EndDate%></td> 
      <td><%:it.smallDescription %></td> 
     </tr> 
      <%=Model.CallRecursion(it,Model.list,ref x) %> 


    <%} %> 

ü可以看到呼叫递归方法对递归返回HTML字符串模式被定义。下面是CallRecursion方法的代码。

public string CallRecursion(TempModel item, List<TempModel> all,ref int count) 
     { 
      if(all.Where(x=>x.ParentID == item.ID).Count() == 0) 
       return ""; 
      else 
      { 
       count++; 
       string retval = "<tr>"; 
       foreach (var kids in all.Where(x => x.ParentID == item.ID)) 
       { 
        retval += "<td><div style='width:"+count*18+"px;' class='wrapper'>&nbsp;</div><span>" + kids.TOC + "</span></td><td>" + kids.label + "</td><td>" + kids.StartDate + "</td><td>" + kids.EndDate+"</td><td>"+kids.smallDescription+"</td></tr>"+ 
         CallRecursion(kids, all,ref count); 
       } 
       count--; 
       return retval; 
      } 


     } 

我的问题是我如何以更清洁的方式实现这个目标。我不知道如果我可以递归地调用部分视图来呈现html,如果是的话,会是什么动态。意见和建议表示赞赏。

回答

1

为什么不修改CTE来给出如下结果,如下所示指定树中每行的哪个级别。通过这种方式,SQL已经在执行递归调用,所以为什么要在应用程序代码中重做这个。

通过这种方式,您的方法可以简化为仅将TreeLevel乘以像素数量以提供正确的缩进。不需要递归。简单地循环通过最终的模型。在任何情况下,我认为你将拥有每个项目TreeLevel的更多价值,因为你可能会做其他事情,比如'给我一个所有根节点的概述',导致行数为Number等于1,2和3的行。

TreeLevel Number Other_data 
0   1  ... 
1   1.1  ... 
1   1.2  ... 
2   1.2.1 ... 
2   1.2.1 ... 
0   2  ... 
1   2.1  ... 
1   2.2  ... 
2   2.1.2 ... 
3   2.1.2.1 ... 
0   3  ... 

至于热膨胀系数,具有从4guysfromrolla看看这个article展示了如何为包括层级(TreeLevel)值作为CTE结果集的一部分。

有关您的原始代码的其他说明 - 从代码构建HTML时使用TagBuilder类。国际海事组织,这将是更清洁,更好。没有魔力建设..

+0

@ahmed感谢您的快速回复。实际上CTE查询是由我的老板编写的,他不是很好。让我问问他是否可以方便地在查询中给我树级别。从逻辑上讲,你的答案是非常正确的。我再次感谢你的全面回答 – 2010-10-22 07:50:34