【问题标题】:How can I use Html.Checkbox to delete repeating groups in ASP.NET MVC?如何使用 Html.Checkbox 删除 ASP.NET MVC 中的重复组?
【发布时间】:2009-08-09 12:30:07
【问题描述】:

我正在为 ASP.NET MVC 中的 Html.Checkbox 苦苦挣扎。想象一个员工有一组重复的孩子:

alt text http://img220.imageshack.us/img220/7208/deletechildrensnapshotk.png

“添加孩子”按钮工作正常,但我不能可靠地使用“删除选定的孩子”。我用这个渲染复选框:

<% int i = 0; %>
<% foreach (var item in Model.Children) { %>   
    <tr>
        <td>
        <%=Html.CheckBox("childrenToDelete[" + i + "]", false, new {value = item.Name})>
        </td>
    </tr>
<% i++; %>
<% } %>

以下是我的控制器操作如何从 FormCollection 中获取要删除的子项列表:

var childrenToDelete = new List<string>();
UpdateModel(childrenToDelete, "childrenToDelete");

然后我使用 ViewModel 模式创建一个对象,其中包含 Employee 和 Child 列表。我无法弄清楚为什么 85% 的时间我会在 Html.Checkbox 行的 View 中抛出异常。大约 15% 的时间,它工作正常。例外是“从类型'System.String'到类型'System.Boolean'的参数转换失败。” IE 然后显示:

  • FormatException:字符串未被识别为有效的布尔值。
  • FormatException: Bobby 不是布尔值的有效值。

当然,“Bobby”不是布尔值,所以它失败了。关于为什么 Html.Checkbox 试图将“Bobby”用作布尔值的任何线索?相同的 ViewModel 可以很好地添加孩子,所以我认为那里没有错误。

【问题讨论】:

  • 请发布您的 POST 操作中的所有代码
  • @eu-ge-ne:这里是:pastebin.ca/1522362
  • 更新:看起来我总是可以删除列表中的最后一个孩子。我传递给 ViewModel 的 newChildren 对象始终具有正确且更新的子级列表。我认为我在这里的策略是正确的,但我一定只是在某个地方有一个错误。

标签: asp.net-mvc


【解决方案1】:

Html.CheckBox 助手向表单添加一个隐藏字段。我建议您为 Children 集合中的每个元素分配一个唯一标识符,然后在您的表单中使用它而不是使用帮助器:

<% foreach (var child in Model.Children) { %>
    <input type="checkbox" name="childrenToDelete" value="<%=child.Id%>" />
<%}%>

然后在你的控制器动作中:

public ActionResult DeleteChildren(string[] childrenToDelete) 
{
    // childrenToDelete array will contain selected ids of children to delete
    return View();
}

【讨论】:

  • 这是我过去使用的策略。很遗憾,MVC 的一些助手似乎使事情变得更复杂。
  • @darin:这就是我一开始尝试做的,但我有其他数据从表单回传,尽管我不得不使用 UpdateModel()。如果我有更多数据进入(可能在 FormCollection 中),我不知道如何将数组用作操作方法参数。有什么想法吗?
【解决方案2】:

终于,我想我明白了。我没有意识到 Html Helpers 从以下位置获取它们的值(引用自 Steven Sanderson 的“Pro ASP.NET MVC Framework”):

  1. ViewData.ModelState["controlName"].Value.RawValue
  2. “value”参数传递给 HTML 帮助方法,或者如果您调用了不包含“value”参数的重载,则 ViewData.Eval("controlName")

由于我的表单是回发的,我的 Html Helpers 尝试首先从 ModelState 获取他们的值。当您尝试删除 Bobby 时,一个示例结果是“Bobby, false”。这可能会以某种方式弄乱 Html.CheckBox 我现在不打算花时间进行调查。正如@darin 指出的那样,没有 Html Helpers 的解决方法就可以了。

自从我的模型正确以来,我很长时间都无法弄清楚这一点。我什至没有想过要看 ModelState。我还没有阅读 Sanderson 书中关于验证的部分,这可能没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 2011-04-12
    • 2019-08-16
    • 2010-10-06
    • 1970-01-01
    • 2016-01-06
    相关资源
    最近更新 更多