私は最近奇妙な問題に遭遇しました。私はタスクという名前のデータベースにテーブルを持っています。タスクには、親タスクと複数の子タスク(自己参加)が含まれる場合があります。CTE(共通テーブル式)を使用して、プロジェクト内のすべてのタスクの子とサブ子をnレベルまで返すストアドプロシージャを作成しました。私の必要な結果は次のとおりです
結果は正常に達成されます。最初の列にインデントが表示され、階層関係が示されます。問題は、私がそれを「悪い方法」でやっているということです。以下は私のビューコードです
<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) %>
<%} %>
uは、html文字列を再帰的に返すモデルでCallrecursionメソッドが定義されていることを確認できます。以下は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をレンダリングできるかどうか、もしそうなら、ダイナミクスはどうなるかわかりません。コメントや提案をいただければ幸いです。