2010-10-22 144 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