首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC Html.RadioButton异常

ASP.NET MVC Html.RadioButton异常
EN

Stack Overflow用户
提问于 2009-04-06 18:42:04
回答 5查看 16.1K关注 0票数 16

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

<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属性将为null,表示他们没有选择按钮。控制器在post期间调用以下验证:

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 MVC1.0。我使用.NET反射器在代码中找到了抛出此错误的位置。

问题是如何让它正确地工作?

编辑:添加堆栈跟踪:

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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-04-06 18:43:02

我刚试过一些能让它工作的东西。如果我不执行验证步骤,问题就不会发生,但我当然需要验证。这给了我一个解决方案的线索。

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

这可以达到预期的效果。

我可能会认为另一个应该可以工作,但这是一个简单的变通方法,我在这里记录了它。

编辑:顺便说一下,我尝试将gender属性更改为字符串,而不是可以为空的int,但同样的问题也出现了。

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

票数 11
EN

Stack Overflow用户

发布于 2009-05-05 09:09:55

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

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

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

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

Stack Overflow用户

发布于 2009-04-06 19:21:11

您可能希望尝试将性别更改为字符串(M/F),而不是int,看看是否有效。

如果你一定要把它作为一个int类型,你可以在后端进行翻译。

private int? gender { get; set; }
public string displayGender
{
    get
    {
        return this.gender.HasValue
                 ? (this.gender.Value == 1 ? "M" : "F" )
                 : null;
    }
    set
    {
        this.gender = null;
        if (value == "M")
           this.gender = 1;
        else if (value == "F")
           this.gender = 2;
    }
}

<label for="gender">Gender</label>
<%= Html.RadioButton("displayGender", "M") %> Male
<%= Html.RadioButton("displayGender", "F") %> Female
<%= Html.ValidationMessage("displayGender") %>

根据您的评论,您可能希望添加以下内容:

<%= Html.RadioButton("displayGender",
                     string.Empty,
                     true, // this is the default
                     new { @style = "display: none;" } ) %>

这将确保回发displayGender (总会有一个选定的单选按钮),并且我认为该值将是string.Empty而不是空引用。如果这行得通,您可能想尝试切换回可以为空的int。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/722655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档