ゴール:
無制限の深さでネストされた要素の階層を持ちます。
問題:
クラス B のインスタンスを含むクラス A があります。
クラス B には Comment オブジェクトのリストがあります。各コメントには、「子」コメントのリストが含まれる場合があります。
したがって、無制限の深さのネストを持つツリーのような構造があります (例: ABComments[1].Comments[0].Comments[5]....)。
クラス A エディター ビューの呼び出し:
@Html.EditorFor(m=>m.B)
クラス B のエディター テンプレートには (簡略化):
<table id="B-comments">
@for (int i = 0; i < Model.Comment.ToList().Count(); i++)
{
@Html.EditorFor(m => m.Comment.ToList()[i])
}
</table>
<a id="addCommentToB" href="#">Add Comment</a>
また、Comment クラスの各 Editor Template は (簡略化して) 以下で構成されます。
<tr>
@using (Html.BeginCollectionItem("B.Comment"))
{
<td>
(... STUF ...)
</td>
(...STUF...)
<td>
<table class ="commentReplies">
@for (int i = 0; i < Model.Comment1.ToList().Count(); i++)
{
@Html.EditorFor(m => m.Comment1.ToList()[i])
}
</table>
<a id="addReply" href="#">Add Reply</a>
</td>
}
<a ...>
リンクは、Ajax を介してエントリ行を取得し、それらを対応するテーブルに追加するために使用されます。
送信時、バインドは最初のネスト レベル (ABComments、ただし ABComments 内のオブジェクトに作成されたコメントでは機能しません) に対してのみ機能します。@using (Html.BeginCollectionItem("B.Comment"))
その理由は、1 レベルの深さのインデックスのみを生成している行が原因である可能性があります。
これらの状況を考慮して、無制限のネストを許可する方法について誰かが提案してくれれば、とても感謝しています。引数を動的に変更する方法はありますかHtml.BeginCollectionItem(ARG)?
乾杯
編集: 要求に応じて簡略化された ViewModels
public partial class A
{
(...)
public int BID{ get; set; }
public virtual B B{ get; set; }
(...)
}
public partial class B
{
(...)
public virtual ICollection<Comment> Comment { get; set; }
}
public partial class Comment
{
(...)
public Nullable<int> ParentID { get; set; }
public virtual ICollection<Comment> Comment1 { get; set; }
public virtual Comment Comment2 { get; set; }
public virtual B B { get; set; }
public Nullable<int> BID { get; set; }
}
補遺:
生成された html の名前と id にプレフィックスを追加し続けない別の BeginCollectionItem() Html ヘルパーを作成することになりました。
例えば:
私が持っていた方法で、コメント内にコメントがある場合、Html ヘルパーは次のようなタグを生成name="*B.Comment[521cfe57-23aa-42d4-9b63-b7fcdd8799c3].*B.Comment.index"
しname="Entity.Comment.index"
ます。
Alberto León は、コメントと B オブジェクトの間の関係をキャプチャするため、実際に詳細なバインド (たとえば、コメントのコメントをその親にバインドするなど) を行う必要がないことを思い出させてくれました。私が望むようにバインディングが機能するのに十分です。