ASP.NETMVC Html.RadioButton异常如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

我的页面上有一个简单的单选按钮列表,在我的视图中呈现如下:

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

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

public int? gender { get; set; }

所以如果他们没有选择一个按钮,并提交页面,性别属性将为空,表明他们没有选择。控制员在帖子中调用以下验证:

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, 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
提问于
用户回答回答于

我只是尝试了一些可以使这项工作。如果我不执行验证步骤,但是当然我需要验证,则不会发生此问题。这给了我一个解决方案的线索。

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

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

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

if (!gender.HasValue)
    ModelState.AddModelError("gender2", "gender required");

这可以按需要工作。

我会认为其他人应该已经工作了,但这是一个简单的解决方法,我正在记录这里。

顺便说一句,我试图将性别属性更改为一个字符串而不是一个可空的int,并发生同样的确切问题。

解决方法似乎仍在为验证消息使用不同的密钥名称。

用户回答回答于

这非常相似,如果不等于复选框问题:Html.Checkbox()辅助方法会生成一个具有错误值的隐藏字段。如果此字段丢失,浏览器将不会发送任何未经检查的框的数据。

然而,一个单选按钮应该有一个值,可能的值可能不止一个。在这种情况下,处理非选择案例并不那么容易,我猜这是不是原因。

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

<%= Html.RadioButton("gender", 1) %> Male
<%= Html.RadioButton("gender", 2) %> Female
<%= Html.Hidden("gender", null) %>

扫码关注云+社区