NET MVC 3 Razor 递归函数

好的,我想显示一个包含列表列表的列表..。

我无法知道要显示多少个级别,所以我想这就是我打破旧的递归例程的地方。

但我不知道该怎么做。

以下是我目前为止的观点(简而言之) :

@foreach(MyObject item in @Model.ListOfObjects){
<div> @item.Title </div>
//Call recursive function?
}

现在每个对象都有一个 List < MyObject > 。我想显示这个 div 下面的每个级别,例如,每个级别都有一个制表符缩进。

我觉得这里可以用剃刀函数但我需要一些帮助。我是这么想的:

@functions{
public static void ShowSubItems(MyObject _object){
if(_object.ListOfObjects.Count>0){
foreach(MyObject subItem in _object.listOfObjects){


// Show subItem in HTML
ShowSubItems(subItem);
}
}
}
}

但正如你看到的,我显然需要一些帮助:)

33273 次浏览

我认为最好为此创建一个 HTML 助手:

public static string ShowSubItems(this HtmlHelper helper, MyObject _object)
{
StringBuilder output = new StringBuilder();
if(_object.ListOfObjects.Count > 0)
{
output.Append("<ul>");


foreach(MyObject subItem in _object.listOfObjects)
{
output.Append("<li>");
output.Append(_object.Title);
output.Append(html.ShowSubItems(subItem.listOfObjects);
output.Append("</li>")
}
output.Append("</ul>");
}
return output.ToString();
}

那就这么说吧:

@foreach(MyObject item in @Model.ListOfObjects){
<div> @item.Title </div>
@html.ShowSubItems(item)
}

Razor 视图引擎允许使用 @helper关键字编写内联递归助手。

@helper ShowTree(IEnumerable<Foo> foos)
{
<ul>
@foreach (var foo in foos)
{
<li>
@foo.Title
@if (foo.Children.Any())
{
@ShowTree(foo.Children)
}
</li>
}
</ul>
}

进去。我们必须使用@函数来代替 helper 标记。下面的代码可能对某些人有用。在这里,“ IssuerData”是我的自定义对象

@{
ShowTreeData(Model.HierarchyList);
}


@functions{


public static void ShowTreeData(IList<IssuerData> issuers)
{
<ul>
@foreach (var i in issuers)
{
<li>
@i.IssuerName
@if (i.Children.Any())
{
ShowTreeData(i.Children);
}
</li>
}
</ul>
}
}