asp.net-mvc - ASP.NET MVC Html.RadioButton 异常

标签 asp.net-mvc

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

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

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

public int? gender { get; set; }

因此,如果他们没有选择按钮并提交页面,则性别属性将为 null,表明他们没有选择。 Controller 在发布期间调用以下验证:

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");

这可以按预期工作。

我本以为另一个应该可以工作,但这是一个简单的解决方法,我在这里记录了这一点。

编辑: 顺便说一句,我尝试将性别属性更改为字符串而不是可为空的整数,并且出现了同样的问题。

解决方法似乎仍然是为验证消息使用不同的 key 名称。

关于asp.net-mvc - ASP.NET MVC Html.RadioButton 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/722655/

相关文章:

c# - ASP.NET MVC 如何处理来自数据库的动态日期时间格式

ajax - 调用 Controller 以基于下拉列表填充文本框,以便使用 Ajax 进行选择

.net - 如何在 Asp.NET MVC 中干净地重用编辑/新 View

asp.net - 刷新图片源

c# - 使用 Web 服务和本地数据库 MVC View 的一对多关系

javascript - "Uncaught TypeError: undefined is not a function"带有简单的 Javascript 插件

c# - MVC 4 - Html.Partial() 显示 DIV 内的 System.Namespace 文本(出现在页面上的 html 中)

asp.net-mvc - MVC 3 SEO 和 Googlebot 异常(exception)

c# - 将区域文件夹中的页面设置为asp.net core 2.2 MVC中的默认页面

asp.net-mvc - 为 ASP.Net MVC 设置测试的最佳实践是什么?使用/处理/等什么?