1

我有一个由许多项目组成的表格(想想亚马逊订单上的订单项目)。每行都有一个与之关联的复选框,因此用户可以选择许多项目并单击“删除”。

表格的构建有点像这样;

<% 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>       
<% } %>

模型活页夹发挥了它的魔力,并且正确填充了列表。但是,在我处理操作中的请求(例如删除适当的项目)并返回包含较少项目的新视图后,表单的状态是“半”持久化。一些复选框保持选中状态,即使在编辑模型中所有布尔值都设置为 false。

如果我返回 a ,我没有这个问题RedirectToActionResult,但是使用它作为解决方案似乎有点棘手。

我想我需要刷新/刷新 ModelState 或类似的东西,但我不确定要搜索的术语以找出方法。

4

3 回答 3

0

您的预感可能是正确的,您可能需要致电

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

顺便说一句,使用重定向通常不被认为是 hack,它实际上是一个相当好的做法,称为 Post Redirect Get (PRG)。

于 2012-10-23T08:09:38.363 回答
0

如果您检查呈现的 HTML,我认为您会发现一个与您的复选框同名的隐藏输入;这就是工作方式HTML.Checkbox。它确实会导致提交一组值。

这可能是您的问题的原因。

善良,

于 2009-11-16T14:29:20.780 回答
0

我想看看你的控制器代码,但认为你的 viewModel 被约定的事实所填充。

在您的索引操作中,我猜您创建了一个新的视图模型。尝试以不同的方式命名,调用实例 indexViewModel 说它不会自动收集以前的 viewModel 数据。

于 2010-03-30T11:38:03.003 回答