ASP.NET MVC Html.RadioButton异常

dav*_*car 16 asp.net-mvc

我在我的页面上有一个简单的单选按钮列表,我在视图中使用以下内容进行渲染:

<label for="gender">Gender</label>
<%= Html.RadioButton("gender", 1) %> Male
<%= Html.RadioButton("gender", 2) %> Female
<%= Html.ValidationMessage("gender") %>
Run Code Online (Sandbox Code Playgroud)

请注意,当用户最初看到此输入时,两个按钮都未被选中.验证是强制他们选择而不是接受默认值.因此,这两个单选按钮绑定到我的模型中的可空int属性,声明为:

public int? gender { get; set; }
Run Code Online (Sandbox Code Playgroud)

因此,如果他们没有选择按钮并提交页面,则gender属性将为null,表示他们没有选择.在帖子期间,控制器调用以下验证:

if (!gender.HasValue)
    ModelState.AddModelError("gender", "gender required");
Run Code Online (Sandbox Code Playgroud)

但是,如果验证失败(他们没有选择),那么在呈现阶段,MVC框架将抛出​​以下异常:

System.NullReferenceException was unhandled by user code
  Message="Object reference not set to an instance of an object."
Run Code Online (Sandbox Code Playgroud)

在寻找这个问题的解决方案时,我注意到有几个问题.我正在使用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, 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
Run Code Online (Sandbox Code Playgroud)

dav*_*car 11

我只是尝试了一些使这项工作的东西.如果我不进行验证步骤,但当然我需要验证,则不会出现此问题.这给了我一个解决方案的线索.

ValidationMessage HtmlHelper方法接受一个字符串参数,该参数是要验证的属性或模型对象的名称.我刚刚将该名称更改为"gender2",如下所示:

<label for="gender">Gender</label>
<%= Html.RadioButton("gender", 1) %> Male
<%= Html.RadioButton("gender", 2) %> Female
<%= Html.ValidationMessage("gender2") %>
Run Code Online (Sandbox Code Playgroud)

我更改了验证代码以引用这个新名称(即使该属性不存在,它仍然有效):

if (!gender.HasValue)
    ModelState.AddModelError("gender2", "gender required");
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作.

我本以为对方应该有用,但这是一个简单的解决方法,我在这里记录.

编辑:顺便说一句,我尝试将性别属性更改为字符串而不是可空的int,并出现相同的问题.

解决方法似乎仍然是使用验证消息的不同密钥名称.


Tho*_*yde 7

这非常相似,如果不等于复选框问题:Html.Checkbox()辅助方法生成一个带有false值的隐藏字段.如果缺少此字段,浏览器将不会为未选中的框发送任何数据.

然而,radiobutton应该具有值,并且可能的值可以多于一个.在这种情况下,处理非选择情况并不是那么容易,我想这是不是的原因.

我的解决方法是添加一个隐藏字段,如下所示:

<%= Html.RadioButton("gender", 1) %> Male
<%= Html.RadioButton("gender", 2) %> Female
<%= Html.Hidden("gender", null) %>
Run Code Online (Sandbox Code Playgroud)