ここで私が解決するために行ったことです。
最初に、新しい部分ビュー _ClientRow.cshtml を作成しました。
@using Extensions.CollectionItemsHtmlExtension
@using ClientViewModel
@model ClientViewModel
<div class = "clientEditRow">
@using(Html.BeginCollectionItem("Clients"))
{
@First Name: @Html.TextBoxFor(c=>c.FirstName)
@Last Name: @Html.TextBoxFor(c=>c.LastName)
}
</div>
この部分的なビューは、クライアントの新しい行をレンダリングします。BeginCollectionItem は、Darin が言及したブログ投稿に従ってダウンロードされた Html 拡張機能です。
次に、私の見解では、次のように設定しました。
<legend>Clients</legend>
<fieldset>
<div id="clientEditorRows">
@foreach(var client in Model.Clients)
{
Html.RenderPartial("_ClientRow", client);
}
</div>
@Html.ActionLink("New Client", "NewClientRow", null, new {id = "addItem"})
</fieldset>
...
<script type="text/javascript" scr="../Scripts/listEditor.js"></script>
foreach はすべてのクライアントをループし、すべてのクライアントの部分ビューをレンダリングします。次に、コントローラーで次のメソッドを作成しました。
public PartialViewResult NewClientRow()
{
return PartialView("_ClientRow", new ClientViewModel())
}
このメソッドは ActionLink によって呼び出され、前の行に追加された新しい行の html を返します。最終的に、ブログ投稿からこの JavaScript ファイル コードを追加し、自分のケースに合わせて変更しました。
listEditor.js
$("#addItem").click(function () {
$.ajax({
url: this.href,
cache: false,
success: function (html) { $("#clientEditorRows").append(html); }
});
return false;
});
この js コードは、新しい行の html をページに追加します。これがお役に立てば幸いです。ありがとうございました。
アレックス
PS: 値を受け取る HttpPost メソッドは変更されておらず、このシグネチャを持っています
[HttpPost]
public ActionResult Create(ResturantViewModel resturantVM)
{
...
}
resturantVM.Clients がすべての値を受け取ることに注意してください。IList Clients パラメータを追加する必要はありません。