asp.net mvc递归渲染html
我最近遇到了一个奇怪的问题。我在数据库中有一个名为任务的表。一项任务可以有一个父任务和多个子任务(自连接)。我编写了一个存储过程,它使用 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) %>
<%} %>
您可以看到 Call recursion 方法已在递归返回 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,如果可以的话,动态会是什么。欢迎提出意见和建议。
i have recently run into a strange problem. i have a table in db named Task. A Task may have a parent task and more than one child tasks (self join). i have written a stored procedure that returns me all the tasks in the project their children and sub children upto n level using CTE (common table expression). my required result is as follows
the result is successfully achieved. you can see the indentation in first column to show hierarchical relation. the problem is that i m doing it in a "bad way". below is my view code
<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 can see that Call recursion method has been defined on model that is returning the html string recursively. below is the code of CallRecursion method.
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;
}
}
my question is how i can achieve this target in a cleaner way. i have no idea if i can call partial views recursively to render the html and if so what would be the dynamics. comments and suggestions are appreciated.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为什么不修改您的 CTE 以获得如下结果指定每行在树中的级别。通过这种方式,SQL 已经执行了递归调用,那么为什么要在应用程序代码中重做此操作呢?
通过这种方式,您的方法可以简化为只需将
TreeLevel
乘以像素数量即可得到正确的缩进。不需要递归。只需循环生成的模型即可。无论如何,我认为拥有每个项目 TreeLevel 会更有价值,因为您可能会执行其他操作,例如“给我所有根节点的概述”,从而导致
Number
等于 1, 2 的行3关于 CTE,请查看此 文章 展示了如何将层次结构 (TreeLevel) 值包含为 CTE 结果集的一部分。
有关原始代码的其他注意事项 - 从代码构造 HTML 时使用 TagBuilder 类。 IMO,这会更干净、更好。没有魔法字符串构建..
Why not modify your CTE to give you results as follows specifies which level in the tree each row is. In this way SQL is already doing the recursive calls, so why redo this in your application code.
In this way, your method can then be simplified to just multiplying the
TreeLevel
by the amount of pixels to give the correct indentation. No need for recursion. Simply loop through the resultant model.In any case, I think you will have more value of having each items TreeLevel because you could possibly do other things like 'give me an overview of all root nodes' resulting in rows where
Number
equals 1, 2 and 3With regards to the CTE, have a look at this article from 4guysfromrolla which shows how to include the hierarchy (TreeLevel) value as part of the CTE result set.
Other notes concerning your original code - use the the TagBuilder classes when constructing HTML from code. IMO, that will be much cleaner and better. No magic strings building..