15

Given multiple HTML checkboxes:

<input type="checkbox" name="catIDs" value="1" />
<input type="checkbox" name="catIDs" value="2" />
...
<input type="checkbox" name="catIDs" value="100" />

How do I retrive an array of integers from a FormCollection in an action:

public ActionResult Edit(FormCollection form)
{
    int [] catIDs = (IEnumerable<int>)form["catIDs"]; // ???

    // alternatively:
    foreach (int catID in form["catIDs"] as *SOME CAST*)
    {
        // ...
    }

    return View();
}

Note: I read the related questions and I don't want to change my action parameters, eg. Edit(int [] catIDs).

Coral Doe
  • 1,925
  • 3
  • 19
  • 36
Petrus Theron
  • 27,855
  • 36
  • 153
  • 287
  • You should change the `name` value of the `checkbox`s into `catIds[]` –  Apr 07 '13 at 16:20

2 Answers2

20

When you have multiple controls with the same name, they are comma separated values. In other words:

string catIDs = form["catIDs"];

catIDs is "1,2,3,..."

So to get all the values you would do this:

string [] AllStrings = form["catIDs"].Split(',');
foreach(string item in AllStrings)
{
    int value = int.Parse(item);
    // handle value
}

Or using Linq:

var allvalues = form["catIDs"].Split(',').Select(x=>int.Parse(x));

Then you can enumerate through all the values.

Keltex
  • 26,220
  • 11
  • 79
  • 111
  • 3
    catIDs might be "1,false,3,4,false,6,...". you might have to remove those falses from your list. – Will Wu Nov 18 '11 at 09:22
17

The safer way would be to use: form.GetValues("CatIds") this will get you the array passed in the post. Just in case you had commas in your input.

anthonyterra
  • 171
  • 1
  • 3