I haver a simple radio button list on my page that I render with the following in my view:
<label for='gender'>Gender</label> <%= Html.RadioButton('gender', 1) %> Male <%= Html.RadioButton('gender', 2) %> Female <%= Html.ValidationMessage('gender') %>
Note that when the user initially sees this input, neither button is selected. The validation is there to force them to choose and not accept a default. Therefore, these two radio buttons are bound to a nullable int property in my model declared as:
public int? gender { get; set; }
So if they do not select a button, and submit the page, the gender property will be null indicating that they did not select. The following validation is called by the controller during the post:
if (!gender.HasValue) ModelState.AddModelError('gender', 'gender required');
But, if the validation fails (they did not choose), then during the rendering phase, the following exception is thrown by the MVC framework:
System.NullReferenceException was unhandled by user code Message='Object reference not set to an instance of an object.'
In searching for for a solution to this problem, I noted several had this problem. I am using ASP.NET MVC 1.0. I found the place in the code where this error is thrown using .NET Reflector.
The question is how to make this work correctly?
EDIT: to add stacktrace:
System.NullReferenceException was unhandled by user code Message='Object reference not set to an instance of an object.' Source='System.Web.Mvc' StackTrace: at System.Web.Mvc.HtmlHelper.GetModelStateValue(String key, Type destinationType) at System.Web.Mvc.Html.InputExtensions.InputHelper(HtmlHelper htmlHelper, InputType inputType, String name, Object value, Boolean useViewData, Boolean isChecked, Boolean setId, Boolean isExplicitValue, IDictionary`2 htmlAttributes) at System.Web.Mvc.Html.InputExtensions.RadioButton(HtmlHelper htmlHelper, String name, Object value, Boolean isChecked, IDictionary`2 htmlAttributes) at System.Web.Mvc.Html.InputExtensions.RadioButton(HtmlHelper htmlHelper, String name, Object value, IDictionary`2 htmlAttributes) at System.Web.Mvc.Html.InputExtensions.RadioButton(HtmlHelper htmlHelper, String name, Object value) at ASP.views_vbs_register_aspx.__RenderregisterContent(HtmlTextWriter __w, Control parameterContainer) in c:\Users\David\Documents\BellevueProject\Bellevue\BellevueTeachers\Forms\Views\VBS\Register.aspx:line 42
I just tried something that makes this work. The problem does not occur if I do not do the validation step but of course I need the validation. That gave me a clue for the solution.
The ValidationMessage HtmlHelper method takes a string argument that is the name of the property or model object being validated. I just changed that name to be ‘gender2’ as follows:
And I changed the validation code to refer to this new name (even though that property does not exist, it still works):
This works as desired.
I would have thought the other should have worked, but this is a simple workaround and I am documenting that here.
EDIT: By the way I tried changing the gender property to a string instead of a nullable int, and the same exact problem occurs.
The work around still seems to be in using a different key name for the Validation Message.