さて、リストのリストのリストを含むリストを表示したい...
表示するレベルの数を知る方法がないため、これが古い再帰ルーチンを解決する場所だと考えました。
しかし、私はこれをどうやって進めるのか正確には問題があります。
これは私がこれまでに持っているものです(ビューで-簡略化):
@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);
}
}
}
}
しかし、あなたが見ることができるように、私は明らかにいくつかの助けが必要です:)
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>
}
これには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)
}