POST后的HTML.CheckBox持久化状态 - 刷新ModelState?

时间:2009-11-16 14:24:15

标签: c# asp.net-mvc checkbox modelstate

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

表单有点像这样;

<% 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,或类似的东西,但我不确定要搜索的术语以找出方法。

3 个答案:

答案 0 :(得分:0)

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

这可能是导致问题的原因。

善,

答案 1 :(得分:0)

我想看看你的控制器代码但是认为你的viewModel正在被惯例填充。

在您的索引操作中,我猜你要创建一个新的viewModel。尝试使用不同的名称,调用实例indexViewModel说,它不会自动收集以前的viewModel数据。

答案 2 :(得分:0)

你的预感可能是正确的,你可能需要打电话

ModelState.Remove("OrderItems[{0}].Checked");
btw使用重定向通常不被认为是黑客,它实际上是一种称为Post Redirect Get(PRG)的好习惯。