ASP.NET MVC を使用して、いくつかの階層データをネストされた順序付けられていないリストにレンダリングする最良の方法を考え出そうとしています。これを行う方法に関するヒントはありますか?
5 に答える
モデルをツリーの形でビューに渡してみませんか?
/// This is the model class
public class MyTreeNode<T>
{
public ICollection<MyTreeNode> ChildNodes {get;}
public T MyValue { get; set; }
bool HasChildren { get { return ChildNodes.Any(); } }
}
///This is the html helper:
public static string RenderTree<T>(this HtmlHelper html, MyTreeNode<T> root, Func<T, string> renderNode)
{
var sb = new StringBuilder();
sb.Append(renderNode(root.MyValue));
if (root.HasChildren)
{
foreach(var child in root.ChildNodes)
{
sb.Append(RenderTree<T>(html, child, renderNode));
}
}
return sb.ToString();
}
このコードを実際にテストしたわけではありませんが、それはアイデアに関するものです。ツリーをレンダリングする独自の再帰的 html ヘルパーを作成することを想像できます。
現在、そのようなコントロールはないと思います.... TreeViews は本質的に複雑です。もちろん、あらゆる種類のリピーターやループを使用して好きなだけ階層を「描く」ことができますが、Web フォーム ツールボックスにあるようなツリー ビューの機能を実現するには... 待つ必要があります。
つまり... ある種のツリー ビューが必要ですか?
実際にツリービュー コントロールを機能させることはできますが、機能させるにはサーバー側のフォーム タグでラップする必要があります。(生成された ID やビューステートなど) 通常の厄介な問題が発生しますが、レンダリングの観点からは機能します。
タグを作成してネストするだけの場合は、 foreach() ループを使用すると非常に簡単です。
ツリーのように機能させるにはjqueryツリービュープラグインをお勧めしますが、レンダリングに関しては、再帰ラムダヘルパーに入れてネストを行うだけです。
そのために(階層メニュー、ツリービューなどのレンダリング)、カスタムコンポーネント(ascx、または新しいプレビュー5のaspx)の再帰呼び出しを使用します。
コンポーネントに最初のレベルのアイテム (アイテムのリスト) を指定し、コンポーネントはリスト内の各アイテムをチェックして、子アイテムがあるかどうかを確認し、その子アイテムのリストでそれ自体を呼び出します。
コントローラー内のオブジェクトの階層グラフ、または ParentID プロパティを使用した 1 次元リストのみを作成できます。