2013-05-27 59 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来检索当前模型的完整路径