ASP.NET MVC 3 Razor recursive function
Okay, so I want to display a list containing lists of lists of lists...
I have no way of knowing how many levels there are to display, so I figured this is where I break out the old recursive routine.
I'm having trouble with exactly how to go about this though.
This is what I have so far (in view - simplified):
@foreach(MyObject item in @Model.ListOfObjects){
<div> @item.Title </div>
//Call recursive function?
}
Now each of these objects also have a List<MyObject>. I want to display each level below this div, with a tab indent per level for instance.
I was thinking a Razor function would be the thing to do here, but I need some help in forming it. Here's my thinking:
@functions{
public static void ShowSubItems(MyObject _object){
if(_object.ListOfObjects.Count>0){
foreach(MyObject subItem in _object.listOfObjects){
// Show subItem in HTML
ShowSubItems(subItem);
}
}
}
}
But as you can see, I plainly need some help :)
Solution 1:
The Razor view engine allows to write inline recursive helpers with the @helper
keyword.
@helper ShowTree(IEnumerable<Foo> foos)
{
<ul>
@foreach (var foo in foos)
{
<li>
@foo.Title
@if (foo.Children.Any())
{
@ShowTree(foo.Children)
}
</li>
}
</ul>
}
Solution 2:
I think it is best to create an HTML helper for this. Something like this:
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();
}
Then call it like this:
@foreach(MyObject item in @Model.ListOfObjects){
<div> @item.Title </div>
@html.ShowSubItems(item)
}
Solution 3:
In .Net core Instead of helper tag we have to use @functions. This below code might useful to some people. Here "IssuerData" is my custom object
@{
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>
}
}