3

Razor を使用してサブモデルを持つ複雑なモデルのフォームをレンダリングする場合、通常は部分ビューを使用してサブモデルをレンダリングします。

簡単な例 モデル:

public class BlogPost
{
    public string Content { get; set; }
    public List<Comment> Comments { get; set; }
}

public class Comment
{
    public string Content { get; set; }
}

ブログポスト.cshtml:

@model BlogPost

@Html.TextAreaFor(x => x.Content)

@for (int i = 0; i < Model.Comments.Count; i++)
{
    @Html.Partial('Comment', Model.Comments[i])
}

コメント.cshtml:

@model Comment

@Html.TextAreaFor(x => x.Content)

問題は次のとおりです。

すべてのフィールドの値を、パラメーターとして受け取るコントローラー アクションに送信したいとしBlogPostます。フィールドは、次のようにコントローラーに戻されます。

Content=The+content+of+the+BlogPost&Content=The+first+Comment&Content=The+second+Comment

しかし、MVC がそれらをビュー モデルに正しくマップするために必要なものは、次のBlogPost命名規則が必要です。

Content=The+content+of+BlogPost&Comments[0].Content=The+first+Comment&Comments[1].Content=The+second+Comment

これをクリーンな方法で実現するにはどうすればよいでしょうか。設計を損なうように見える 2 つの方法しか考えられません。

  • をモデルとして部分ビューに渡し、BlogPostテキスト領域を次のように定義できるようにします@Html.TextAreaFor(x => x.Comments[i].Content)。ただし、これは、コメントの部分ビューを親ビュー モデルに結合することを意味します。同じ部分ビューを別のコンテキストで使用する必要があるシナリオを考えることができます。部分ビューが親ビュー モデルに依存している場合、これは不可能です。さらに、i何らかの方法で部分ビューに渡す必要があります。
  • または、すべての単一フィールドの名前を文字列で明示的に定義する方法にフォールバックします: @Html.TextArea(ViewBag.Prefix + ".Content").

すべてのフィールド名に特定のプレフィックスを適用するように部分ビューに指示する方法はありますか?

4

1 に答える 1

2

チッコドロ、

type の EditorFor テンプレートを作成するとComment、mvc がこれらすべてを美しく処理します。ただし、これは行がすでに DB に存在するシナリオでのみうまく機能します。SOからの例:

かみそりで親子を提出する

その場で新しい行を作成する必要がある場合は、フィールドが必要に応じて動作できるように、ちょっとしたトリックを使用する必要があります。実行時にコレクション項目を追加でき、目立たない検証などを保持できるスティーブン・サンダーソンのウェブサイトの記事を使用しました。この SO の質問と関連記事の参照を参照してください。

可変長リストの編集、テーブルを使用した ASP.NET MVC 3 スタイル

于 2012-07-13T16:29:50.640 に答える