Alex Rivera | Logout

Why Html.Checkbox("Visible") returns "true, false" in ASP.NET MVC 2?

Asked 2011-05-09T11:10:12.137
25

I'm using Html.Checkbox("Visible") for displaying a check box to user. In post back, FormCollection["Visible"] value is "true, false". Why?

in view:

<td>                
    <%: Html.CheckBox("Visible") %>
</td>

in controller:

 adslService.Visible = bool.Parse(collection["Visible"]);
Edit
Report

1 Answer

32

That's because the CheckBox helper generates an additional hidden field with the same name as the checkbox (you can see it by browsing the generated source code):

<input checked="checked" id="Visible" name="Visible" type="checkbox" value="true" />
<input name="Visible" type="hidden" value="false" />

So both values are sent to the controller action when you submit the form. Here's a comment directly from the ASP.NET MVC source code explaining the reasoning behind this additional hidden field:

if (inputType == InputType.CheckBox) {
    // Render an additional <input type="hidden".../> for checkboxes. This
    // addresses scenarios where unchecked checkboxes are not sent in the request.
    // Sending a hidden input makes it possible to know that the checkbox was present
    // on the page when the request was submitted.
    ...

Instead of using FormCollection I would recommend you using view models as action parameters or directly scalar types and leave the hassle of parsing to the default model binder:

public ActionResult SomeAction(bool visible)
{
    ...
}
answered 2011-05-09T11:12:52.950

Your Answer