ASP.NET MVC 3 Рекурсивная функция бритвы
Хорошо, поэтому я хочу отобразить список, содержащий списки списков списков...
У меня нет способа узнать, сколько уровней для отображения, поэтому я решил, что это то, где я выхожу из старой рекурсивной процедуры.
У меня возникли проблемы с тем, как это сделать, хотя.
Это то, что я до сих пор (по-видимому - упрощенный):
@foreach(MyObject item in @Model.ListOfObjects){
<div> @item.Title </div>
//Call recursive function?
}
Теперь каждый из этих объектов также имеет List <MyObject> . Я хочу отобразить каждый уровень ниже этого div, например, с отступом вкладки на уровень.
Я думал, что функция Razor будет здесь, но мне нужна помощь в ее формировании. Здесь мое мышление:
@functions{
public static void ShowSubItems(MyObject _object){
if(_object.ListOfObjects.Count>0){
foreach(MyObject subItem in _object.listOfObjects){
// Show subItem in HTML
ShowSubItems(subItem);
}
}
}
}
Но, как вы можете видеть, мне явно нужна помощь:)
Ответы
Ответ 1
Механизм просмотра 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>
}
Ответ 2
Я думаю, что лучше всего создать помощник 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)
}