+4  A: 

Html.CheckBox helper adds a hidden field to the form. I would suggest you assigning an unique identifier to each element in the Children collection and then have this in your form instead of using the helper:

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

And then in your controller action:

public ActionResult DeleteChildren(string[] childrenToDelete) 
{
    // childrenToDelete array will contain selected ids of children to delete
    return View();
}
Darin Dimitrov
This is a strategy I have used in the past. It's a shame that a few of MVC's helpers seem to make things more complicated.
Sam Wessel
@darin: That's what I tried to do at first, but I have other data posted back from the form and though I had to use UpdateModel(). I dno't see how I can use an array as an action method parameter if I have more data coming in, perhaps in a FormCollection. Any ideas?
Slack
A: 

At long last, I think I figured it out. I didn't realize that Html Helpers get their values from the following locations (quoted from "Pro ASP.NET MVC Framework" by Steven Sanderson):

  1. ViewData.ModelState["controlName"].Value.RawValue
  2. "value" parameter passed to HTML helper method, or if you've called an overload that doesn't include a "value" parameter, then ViewData.Eval("controlName")

Since my form is a post-back, my Html Helpers tried to first get their values from ModelState. An example result is "Bobby, false" for when you try to delete Bobby. That likely messes up Html.CheckBox in some way I'm not going to take the time to investigate right now. As @darin points out, a workaround without Html Helpers works just fine.

I couldn't figure this out for the longest time since my Model was correct. I didn't even think to look at ModelState. It probably didn't help that I hadn't yet read the section on validation in Sanderson's book.

Slack