我在我的页面上看到一个简单的单选按钮列表,我在以下视图中呈现:
<label for="gender">Gender</label> <%= Html.RadioButton("gender",1) %> Male <%= Html.RadioButton("gender",2) %> Female <%= Html.ValidationMessage("gender") %>
请注意,当用户最初看到此输入时,两个按钮均未选中。
验证是强制他们选择并不接受默认。
因此,这两个单选按钮被绑定到一个可空的int属性,在我的模型中声明为:
public int? gender { get; set; }
所以如果他们没有选择一个按钮并提交该页面,那么gender属性将为空,表示它们没有被选择。控制器在发布过程中调用以下验证:
if (!gender.HasValue) ModelState.AddModelError("gender","gender required");
但是,如果验证失败(他们没有选择),那么在渲染阶段,MVC框架会抛出以下异常:
System.NullReferenceException was unhandled by user code Message="Object reference not set to an instance of an object."
在寻找解决这个问题的方法时,我注意到有几个问题。
我正在使用ASP.NET MVC 1.0。我在代码中找到了使用.NET Reflector抛出此错误的地方。
问题是如何使这项工作正常?
编辑:添加堆栈跟踪:
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,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
解决方法
我只是尝试了一些使这项工作的东西。
如果我不执行验证步骤,但是当然需要验证,则不会出现此问题。
这给了我一个解决方案的线索。
如果我不执行验证步骤,但是当然需要验证,则不会出现此问题。
这给了我一个解决方案的线索。
ValidationMessage HtmlHelper方法接受一个字符串参数,该参数是要验证的属性或模型对象的名称。
我刚才把这个名字改成“gender2”,如下所示:
<label for="gender">Gender</label> <%= Html.RadioButton("gender",2) %> Female <%= Html.ValidationMessage("gender2") %>
而且我更改了验证码来引用这个新名称(即使该属性不存在,它仍然可以使用):
if (!gender.HasValue) ModelState.AddModelError("gender2","gender required");
这可以按需要工作。
我会以为其他应该是有效的,但这是一个简单的解决方法,我在这里记录。
编辑:
顺便说一下,我尝试将gender属性更改为字符串而不是可空的int,并发生相同的确切问题。
该工作仍然似乎在为验证消息使用不同的密钥名称。