1

クライアントがさまざまな量のモデルを注文するために使用するフォームを作成しようとしています。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.ascxEditorTemplate の興味深いフラグメント:

<div class="editor-field">
    <%: Html.EditorFor(model => model.Name) %>
    <%: Html.DisplayFor(model => model.Name) %>
</div>

私の私はタイプのOrderCreateModelプロパティを持っているので、単なるリストですInputOrderCreateModel.InputModelModel.Input.ModelsModelCreateModel

今私なら:

  1. このフォームを使用して 3 つのモデルを追加します (名前はAAABBBCCC )

  2. delete#0送信をクリックしてモデルAAAを削除します

その結果、モデルAAAおよびBBB用のエディターを取得しますが、モデルBBBおよびCCC用のディスプレイを取得します。それは私にはあまりにもクレイジーです!フィドラーで確認しましたが、これが実際の応答の様子です。ブラウザのせいではありません。また、コードをデバッグした後、に渡す前にBBBモデルを削除していることを 100% 確信しています。Input.ModelsView()

どうすればこれを修正できますか?

注: これには 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抽出して に入れます。deleteModelNrViewData

FillCreateModelWithMapsデータで埋めるだけviewModel.ExistingMapsです。

4

2 に答える 2

2

これをアクションに追加します。

ViewData.ModelState.Clear();

于 2011-05-18T16:18:37.697 に答える
0

EditorFor()ViewData.ModelStateまた、モデル自体の代わりに使用する他のヘルパー メソッドもあります。そのため、モデルへの変更は実際にはサポートされていないようです。私の考えでは、これは MVC の重大なバグのように見えます。

于 2011-05-18T16:11:53.110 に答える