「コレクション変数名」の意味がわかりませんが、おそらく私の解決策は、あなたが気づいた魔法のようなものです。
私の解決策は、要素の既存のエディターをコピーし、Javascript を介して入力名を変更することに基づいています。
まず、エディタをマークアップする必要があります。これはコレクション用のフォーム出力エディタのコードです
@for (var i = 0; i < Model.Count; i++)
{
<div class="contact-card">
@Html.LabelFor(c => Model[i].FirstName, "First Name")
@Html.TextBoxFor(c => Model[i].FirstName)
<br />
@Html.LabelFor(c => Model[i].LastName, "Last Name")
@Html.TextBoxFor(c => Model[i].LastName)
<br />
@Html.LabelFor(c => Model[i].Email, "Email")
@Html.TextBoxFor(c => Model[i].Email)
<br />
@Html.LabelFor(c => Model[i].Phone, "Phone")
@Html.TextBoxFor(c => Model[i].Phone)
<hr />
</div>
}
私たちのエディタは class で div に配置されcontact-card
ます。レンダリング時に、ASP.NET MVC は、プロパティ エディターとして使用される入力[0].FirstName
に 、[0].LastName
...[22].FirstName
などの名前を付けます。[22].LastName
送信時に、Model Binder はこれをインデックスとプロパティ名の両方に基づいてエンティティのコレクションに変換します。
次に、最後のエディターをコピーし、括弧内のインデックスを 1 増やす JavaScript 関数を作成します。送信すると、コレクションに追加の要素が追加されます。
var lastContent = $("#contact-form .contact-card").last().clone();
$("#contact-form .contact-card").last().after(lastContent);
$("#contact-form .contact-card")
.last()
.find("input")
.each(function () {
var currentName = $(this).attr("name");
var regex = /\[([0-9])\]/;
var newName = currentName.replace(regex, '[' + (parseInt(currentName.match(regex)[1]) + 1) + ']');
$(this).val('');
$(this).attr('name', newName);
});
出来上がり!送信すると、もう 1 つの要素が取得されます。