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")
.
すべてのフィールド名に特定のプレフィックスを適用するように部分ビューに指示する方法はありますか?