peter
peter

Reputation: 2113

MVC checkboxes & FormCollection

On a mass-edit form page I display about 50 objects that have some boolean properties as well. The controller receives a FormCollection with all values from the edit page.

    public void _EditAll(FormCollection c)
    {
        int i = 0;
        if (ModelState.IsValid)
        {
            var arrId = c.GetValues("channel.ID");
            var arrName = c.GetValues("channel.displayedName");
            var arrCheckbox = c.GetValues("channel.isActive");

            for (i = 0; i < arrId.Count(); i++)
            {
                Channel chan = db.Channels.Find(Convert.ToInt32(arrId[i]));
                chan.displayedName = arrName[i];
                chan.isActive = Convert.ToBoolean(arrCheckbox[i]);
                db.Entry(chan).State = EntityState.Modified;
            }
            db.SaveChanges();
        }
     }

Now, for checkboxes, MVC creates hidden inputs on the form (otherwise "false" could not be posted back). In the controller, when receiving the FormCollection, this leads to the case that I receive an array of say

since the hidden checkbox has the same name as the visible one.

What's a good way to handle that and get the proper value of the checkbox?

Upvotes: 0

Views: 3509

Answers (2)

LINQ2Vodka
LINQ2Vodka

Reputation: 3036

Sample for editing array of entities that have boolean field.

Entity:

public class Entity
{
    public int Id { get; set; }
    public bool State { get; set; }
}

Controller:

public ActionResult Index()
{
    Entity[] model = new Entity[]
        {
            new Entity() {Id = 1, State = true},
            new Entity() {Id = 2, State = false},
            new Entity() {Id = 3, State = true}
        };
    return View(model);
}

[HttpPost]
public ActionResult Index(Entity[] entities)
{
    // here you can see populated model
    throw new NotImplementedException();
}

View:

@model Entity[]
@{
    using (Html.BeginForm())
    {
        for (int i = 0; i < Model.Count(); i++ )
        {
            @Html.Hidden("entities[" + i + "].Id", Model[i].Id)
            @Html.CheckBox("entities[" + i + "].State", Model[i].State)
        }
        <input type="submit"/>
    }
}

The only tricky thing is html elements naming.
More info about binding arrays.

Upvotes: 1

peter
peter

Reputation: 2113

I'm converting all arrays containing checkbox-values:

"false" => "false", if not preceded by "true"

Upvotes: 0

Related Questions