目标:无限嵌套
有无限的深度嵌套元素的层次结构。
问题:
我有一个类A,它包括一个类B.
类B具有注释的对象的列表的一个实例。每个评论可能有一个“孩子”评论列表。因此,我们具有无限深度嵌套的树状结构(例如A.B.Comments [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类由(简化):
<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获取条目行并追加它们到相应的表格。
提交时,绑定仅适用于第一个嵌套级别(A.B.Comments,但不适用于对A.B.Comments中的对象所做的注释)。原因很可能是由于@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; }
}
附录:
我结束了创建一个不同的BeginCollectionItem()Html助手,它不会为所生成的html的名称和id添加前缀。
例如为:
我不得不说一句,如果我有一个注释中的注释,在HTML帮助会产生这样的标签:name="*B.Comment[521cfe57-23aa-42d4-9b63-b7fcdd8799c3].*B.Comment.index"
我的新方法只产生name="Entity.Comment.index"
允许结合才能正常工作。
AlbertoLeón通过提醒我提醒我,我没有必要实际深入地进行绑定(例如,将评论的评论绑定到它的父级等),以捕获评论之间的关系而B对象足以让绑定按我的意愿工作。
请问附上至少有限的视图模型源代码版本?谢谢。 – Jakub
我并不认为这个问题是必要的,但我已经在我的编辑中添加了这样的情况,以便它可以帮助更好地理解问题。 – user1987392