1

ゴール:

無制限の深さでネストされた要素の階層を持ちます。

問題:

クラス 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 オブジェクトの間の関係をキャプチャするため、実際に詳細なバインド (たとえば、コメントのコメントをその親にバインドするなど) を行う必要がないことを思い出させてくれました。私が望むようにバインディングが機能するのに十分です。

4

2 に答える 2

1

あなたはこれを複雑な方法で行っています。数年前、私は Bside ソーシャル エンジンを設計しましたが、残念なことに、何も見つかりませんでした。

同じ問題を見つけましたが、非常に簡単な解決策があります。

各コンテンツに GUID を割り当て、各コメントを新しいコンテンツとして想定する必要があるため、いつでも GUID コンテンツを検索できます。次に、プロパティ Comments とメソッド Add、Delete、Edit を使用してインターフェイス ICommentable を作成するだけです。

次に、ICommentable を継承した A クラスが必要であり、実装を記述する必要があります。Bも同様。

次に、ビジネス層で、データベースまたはストレージの方法から A と B を取得します。データベースで A と B のコメントを検索します。取得したら、コメントのコメントを検索する必要があります。

したがって、保存方法では、コメントは常にコメントです。コメントに関連するコンテンツ アイテムについて意味がありません。

ajaxによるユーザーインターフェースについては、jQueryを使用しました。だから、束縛しようとしないでください。各コメントを独立したオブジェクトとして扱います。コメント追加、保存する各追加ボタンは、コメントのみ参照可能です。新しいコメントを含むフォームを MVC メソッドに送信するだけです。親コンテンツ アイテムの GUID を忘れないでください (クラス A、B、または任意のコメント オブジェクト)。

于 2013-05-27T16:31:13.030 に答える