Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bind Checkboxes to int array/enumerable in MVC

@Html.CheckBox("orderNumbers", new { value = 1 })
@Html.CheckBox("orderNumbers", new { value = 2 })
@Html.CheckBox("orderNumbers", new { value = 3 })
@Html.CheckBox("orderNumbers", new { value = 4 })
@Html.CheckBox("orderNumbers", new { value = 5 })

[HttpPost]
public ActionResult MarkAsCompleted(IEnumerable<int> orderNumbers) { }

[HttpPost]
public ActionResult MarkAsCompleted(IEnumerable<string> orderNumbers) { }

If I use the first signature in my action method, I get an empty IEnumerable.

If I use the second signature I do receive the values but I also receive a false value for the unselected values (because of MVCs pattern of shadowing all checkboxes with a hidden field).

e.g. I will receive something like orderNumbers = { "1", "2", "false", "4", "false" }

Why can't I just get the list of numbers?

like image 243
fearofawhackplanet Avatar asked Dec 16 '11 12:12

fearofawhackplanet


3 Answers

You can get all the checked values by the following way.

Controller code :

    public ActionResult Index()
    {            
        return View();
    }

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Index(string[] orderNumbers)
    {
        return View();
    }

View Code :

@using (Html.BeginForm())
{
    <input name="orderNumbers" type="checkbox" value="1" />
    <input name="orderNumbers" type="checkbox" value="2" />
    <input name="orderNumbers" type="checkbox" value="3" />
    <input name="orderNumbers" type="checkbox" value="4" />
    <input name="orderNumbers" type="checkbox" value="5" />

    <input type="submit" name="temp" value="hi" />
}

Please keep one thing in my mind that, you need to give same name to all checkboxes. In array you will get values for all checked checkboxes.

like image 83
alok_dida Avatar answered Nov 02 '22 08:11

alok_dida


Because thats how the provided CheckBoxFor helper is working.

You have to generate the html for the checkboxes yourself. Then the hidden inputs are not generated and you will get only the selected integer values.

like image 23
Jan Avatar answered Nov 02 '22 06:11

Jan


In addition to alok_dida's great answer. Since all the values are integers, you can have your controller code take an array of integers and avoid doing the conversion yourself.

This works in MVC4+:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(int[] orderNumbers)
{
    return View();
}
like image 5
David W Gray Avatar answered Nov 02 '22 07:11

David W Gray