How can I get the CheckBox to maintain checked state via postback in ASP.NET MVC?

I have an ASP.NET MVC project with a form. In the Action method that handles the POST verb, I have a custom implementation IModelBinder

that binds the form data to my model instance. If there are errors, I use bindingContext.ModelState.SetAttemptedValue()

and bindingContext.ModelState.AddModelError()

to store the posted value and the error message in ModelState

.

This works great and I can see the expected behavior on my input elements being rendered with Html.TextBox()

(which calls before Html.InputHelper()

). When I use Html.CheckBox()

(which also calls before Html.InputHelper()

), the state of my CheckBox is NOT outputted to the tag <input />

.

It seems to me that the method Html.InputHelper()

does not use the AttemptedValue method from ModelState for input fields of type CheckBox.

Here is the code from ASP.NET MVC methodHtml.InputHelper()

.

Why is it that CheckBox tryedValue is not output to the input tag. Is there something I'm missing here, or do I need to manually handle this case by checking the ModelState and setting the tag attribute myself?

Update 11/09
Here is the call HtmlHelpers

I am using to display the CheckBox:

<%= Html.CheckBox("IsDerived") %>

      

And here is the call I use to register the Attempt value:

string isDerivedRequestValue = !string.IsNullOrEmpty(bindingContext.HttpContext.Request["IsDerived"]) ? bindingContext.HttpContext.Request.Form.GetValues("IsDerived") [0] : null;
bindingContext.ModelState.SetAttemptedValue("IsDerived", isDerivedRequestValue);

      

0


source to share


1 answer


I'm not sure if this is the best way to solve the problem or not, but since the method Html.InputHelper()

does not validate the TryemptedValue controls for the CheckBox, I added the following to my controller which inserts the correct value from ModelState

to ViewData

and seems to do the trick quite well.

ViewData["IsDerived"] = ViewData.ModelState.ContainsKey("IsDerived")
                           ? bool.Parse(ViewData.ModelState["IsDerived"].AttemptedValue)
                           : false;

      



Make sure you don't explicitly set the parameter value isChecked

when you call Html.CheckBox()

, as this will override any value stored in ViewData

.

+1


source







All Articles