1

私は多くのアイテムで構成されたフォームを持っています(Amazonの注文で注文アイテムを考えてください)。各行にはチェックボックスが関連付けられているため、ユーザーは多くのアイテムを選択して[削除]をクリックできます。

フォームはこのように少し構成されています。

<% for (int i = 0; i < Model.OrderItems.Count; i++) { %> 
<tr>
    <td><%= Html.Hidden(String.Format("OrderItems[{0}].Id", i), Model.OrderItems[i].Id)%>
        <%= Html.CheckBox(String.Format("OrderItems[{0}].Checked", i), Model.OrderItems[i].Checked)%></td>
    <td><%= Html.TextBox(String.Format("OrderItems[{0}].Name", i), Model.OrderItems[i].Name)%></td>
    <td><%= Html.TextBox(String.Format("OrderItems[{0}].Cost", i), Model.OrderItems[i].Cost)%></td>
    <td><%= Html.TextBox(String.Format("OrderItems[{0}].Quantity", i), Model.OrderItems[i].Quantity)%></td>
</tr>       
<% } %>

モデルバインダーはその魔法をうまく実行し、リストは正しく入力されます。ただし、アクションでリクエストを処理し(たとえば、適切なアイテムを削除して)、より少ないアイテムを含む新しいビューを返した後、フォームの状態は「半」持続します。編集モデルではすべてのboolがfalseに設定されていますが、一部のチェックボックスはオンのままです。

を返す場合、この問題は発生しませんがRedirectToActionResult、それを解決策として使用することは、少し厄介な回避策のようです。

ModelState、または同様の何かをフラッシュ/更新する必要があると思いますが、その方法を見つけるために検索する用語がわかりません。

4

3 に答える 3

0

レンダリングされたHTMLをチェックすると、チェックボックスと同じ名前の非表示の入力が見つかると思います。これが機能する方法HTML.Checkboxです。一連の値が送信されることになります。

これが問題の原因である可能性があります。

親切、

ダン

于 2009-11-16T14:29:20.780 に答える
0

あなたのコントローラーコードを見たいのですが、慣例によりviewModelが満たされていると思います。

あなたの Index アクションでは、新しいビューモデルを作成していると思います。これに別の名前を付けて、インスタンス indexViewModel を呼び出すと、以前の viewModel データが自動的に収集されません。

于 2010-03-30T11:38:03.003 に答える
0

あなたの勘はおそらく正しいでしょう。おそらく電話する必要があります

ModelState.Remove("OrderItems[{0}].Checked");

ところで、通常、リダイレクトを使用することはハックとは見なされません。実際には、Post Redirect Get (PRG) と呼ばれるかなり良い方法です。

于 2012-10-23T08:09:38.363 に答える