我最近遇到了一個奇怪的問題。我有一個名爲Task的數據庫表。一個任務可能有一個父任務和多個子任務(自加入)。我編寫了一個存儲過程,使用CTE(公用表表達式)將項目中的所有任務返回給子項和子級達到n級。我要求的結果如下asp.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;"> </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'> </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,如果是的話,會是什麼動態。意見和建議表示讚賞。
@ahmed感謝您的快速回復。實際上CTE查詢是由我的老闆編寫的,他不是很好。讓我問問他是否可以方便地在查詢中給我樹級別。從邏輯上講,你的答案是非常正確的。我再次感謝你的全面回答 – 2010-10-22 07:50:34