目標:無限嵌套
有無限的深度嵌套元素的層次結構。
問題:
我有一個類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