クライアントがさまざまな量のモデルを注文するために使用するフォームを作成しようとしています。Steve Sanderson のブログの例に似ていますが、JavaScript は使用していません。フォームに複数の送信があるだけです。
すべてが正常に機能し、必要な数のアイテムを追加できますが、アイテムを削除すると、常にリストの最後のアイテムが削除されます。ここにいくつかのコードがあります:
からのフラグメントCreate.aspx
:
<% for (int i = 0; i < Model.Input.Models.Count; i++ ){%>
<%: Html.EditorFor(m => m.Input.Models[i])%>
<p><input type="submit" name="deleteModel#<%:i%>" value="Delete" /></p>
<%}%>
ModelCreateModel.ascx
EditorTemplate の興味深いフラグメント:
<div class="editor-field">
<%: Html.EditorFor(model => model.Name) %>
<%: Html.DisplayFor(model => model.Name) %>
</div>
私の私はタイプのOrderCreateModel
プロパティを持っているので、単なるリストですInput
OrderCreateModel.InputModel
Model.Input.Models
ModelCreateModel
今私なら:
このフォームを使用して 3 つのモデルを追加します (名前はAAA、BBB、CCC )
delete#0
送信をクリックしてモデルAAAを削除します
その結果、モデルAAAおよびBBB用のエディターを取得しますが、モデルBBBおよびCCC用のディスプレイを取得します。それは私にはあまりにもクレイジーです!フィドラーで確認しましたが、これが実際の応答の様子です。ブラウザのせいではありません。また、コードをデバッグした後、に渡す前にBBBモデルを削除していることを 100% 確信しています。Input.Models
View()
どうすればこれを修正できますか?
注: これには JavaScript を使用したくありません。より良いユーザー エクスペリエンスを提供するために後で追加されますが、サイトは JavaScript を無効にしても機能する必要があります。
編集:
コントローラーのコード:
[HttpPost]
[ActionName("Create")]
[MultipleSubmits(InputName = "deleteModel", Argument = "deleteModelNr")]
[Authorize(Roles = RoleHelper.Accountant + "," + RoleHelper.Admin)]
public ActionResult CreateDeleteModel(OrderCreateModel.InputModel input)
{
var viewModel = new OrderCreateModel {Input = input};
FillCreateModelWithMaps(viewModel, input.ClientId);
var deleteModelNr = (int) ViewData["deleteModelNr"];
if (input.Models.Count > deleteModelNr)
input.Models.RemoveAt(deleteModelNr);
return View(viewModel);
}
MutlipleSubmitsAttribute
から継承し、ここでサブミット名からActionNameSelectorAttribute
抽出して に入れます。deleteModelNr
ViewData
FillCreateModelWithMaps
データで埋めるだけviewModel.ExistingMaps
です。