2013-05-27 117 views
1

目標:無限嵌套

有無限的深度嵌套元素的層次結構。

問題:

我有一個類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對象足以讓綁定按我的意願工作。

+0

請問附上至少有限的視圖模型源代碼版本?謝謝。 – Jakub

+0

我並不認爲這個問題是必要的,但我已經在我的編輯中添加了這樣的情況,以便它可以幫助更好地理解問題。 – user1987392

回答

1

你正在以複雜的方式做到這一點。 幾年前,我設計了可悲死亡的Bside社交引擎,因爲沒有發現。

我發現了同樣的問題,它有一個非常簡單的解決方案。

您需要爲每個內容分配一個guid,並將每個註釋假設爲一個新內容,因此您始終可以搜索guid內容。 然後你只需要創建接口ICommentable的屬性評論和方法添加,刪除,編輯

然後你需要A類繼承ICommentable,你需要編寫實現。 B相同。

然後在業務層,您可以從數據庫或存儲方式獲得A和B.並搜索數據庫中的A和B評論。當你得到它時,你需要搜索評論的評論。

所以在存儲的方式,評論總是評論。對與評論相關的內容項目沒有意義。

關於使用ajax的用戶界面,我使用jQuery。 所以不要試圖綁定請。 將每個評論視爲獨立的對象。 每個添加按鈕添加評論和保存,只能引用評論。您只需要向MVC方法發送帶有新評論的表單。不要忘記父內容項(類A或B或任何註釋對象)的指導

+0

我最終以一種不同的方式工作,但你確實指出了我正確的方向,並且你的回答可能適用於任何人遇到同樣問題的人。 謝謝。 – user1987392

0

您可以使用ViewData.TemplateInfo.GetFullHtmlFieldName()或ViewData.TemplateInfo.HtmlFieldPrefix來檢索當前模型的完整路徑