私はCategoryModel
というクラスを持っていますが、そのプロパティの1つは同じタイプのオブジェクトのリストです。したがってCategoryModel.Categories
はList<CategoryModel>
です。MVCエディタ1つのページに複数の編集フォームをモデルバインドする
カテゴリインデックスページでは、各カテゴリのエディタを表示して、専用のページに移動しなくてもカテゴリ名を変更できるようにしました。これと同じように:
CategoryModel
ため
<ul id="categories>
@Html.EditorFor(model => model.Categories)
</ul>
、エディタのテンプレートは次のようになります。
<li class="folder">
@using (Html.BeginForm("Edit", "Category", new { id = Model.Key }, FormMethod.Post, new { @class = "ajaxoff"})) {
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Key)
@Html.HiddenFor(model => model.ParentKey)
@Html.HiddenFor(model => model.Sequence)
@Html.HiddenFor(model => model.IncludeDeleted)
@Html.TextBoxFor(model => model.Name, null, new { @class = "catName" })
@Html.ValidationMessageFor(model => model.Name)
<input type="submit" value="Save" class="icon save" />
}
</li>
私が持っている問題は、フォームを送信すると、CategoryController
のEdit
アクションに正しく結合しないということです。
[HttpPost]
public ActionResult Edit(CategoryModel category)
{
// At this point all properties in category are null
}
隠しフィールドとテキストボックスの名前を確認すると、現在のカテゴリの位置に基づいてラベルが付けられますory(例えば、 Categories[0].Name
)。ただし、専用の編集ビューを作成した場合、フィールド名に基づいて名前が付けられます(例:Name
)。
私は、カテゴリーのリストを受け入れるようにコントローラを変更しようとしている:
[HttpPost]
public ActionResult Edit(List<CategoryModel> categories)
{
var category = categories.First();
}
私は非常に最初のカテゴリを提出する場合、これは動作しますが、他のどれも(これらの例でCategories
がnullではありません)。
私も、私はこれを行うことによって、私のEditorForの表示方法を変更しようとしている:
<ul id="categories>
@foreach (var cat in Model.Categories)
{
@Html.EditorFor(model => cat);
}
</ul>
(例えば、すべてのカテゴリ名がcat.Name
と呼ばれている)、カテゴリごとに同じになるようにフィールド名を変更する、その私が信じることは正しい方向への一歩です。
コントローラに正しくバインドするにはどうすればよいですか?親カテゴリー全体をサブミットしてから各サブカテゴリーを保存することができますが、これは単一の変更をサブミットするのは非常に非効率的な方法です。
私はこれをしましたが、フィールド名の後に[0]と[1]が得られます。どうしましたか? – Dennis
あなたが説明した問題は発生しませんでした。上記のループの代わりに@ Html.EditorFor(model => model.Categories、null、 "")を使用した場合、フィールド名の前に[0]と[1]が得られます。個々のモデルの代わりにEditorForメソッドを使用します。 – Maloric