首页 文章

Radiobutton,checkbox和select元素不会相应地填充

提问于
浏览
0

我有不同类型的元素 - 我的视图上的文本框,选择,复选框和单选按钮 . 当我使用模型呈现这个强类型视图时,有一些元素会填充相应的模型值,但有某些类型和不存在的类型 . 单选按钮,复选框为空白 . 当涉及到选择元素时,如果它们是使用 @Html.DropDownListFor 辅助方法创建的,那么它们将获得正确的值,但如果它们只是普通的Html选择,其名称对应于模型属性,则选择默认的第一个项目 . 我用@Html辅助方法创建了复选框和单选按钮:

@Html.RadioButtonFor(x => x.PreferredReplyMethod, PreferredReplyMethod.Written.GetHashCode(), new { id = "rbReplyWritten" })
            <label for="rbReplyWritten">Written</label>
            @Html.RadioButtonFor(x => x.PreferredReplyMethod, PreferredReplyMethod.Verbal.GetHashCode(), new { id = "rbReplyVerbal" })
            <label for="rbReplyVerbal">Verbal</label>

         @Html.CheckBoxFor(x => x.IsUnderControl, new { id = "chkUnderControl" })
         @Html.LabelFor(x => x.IsUnderControl, new { @for = "chkUnderControl" })

问题是,如果我将这些值发布回服务器,则所有保存的值都是正确的 . 我该怎么办?

1 回答

  • 2

    我终于找到了问题的原因 . 因此,当你阅读时, grab 你的咖啡(当然是那些像我一样不熟悉ASP.NET MVC模型的人) . 正如我所说,我遇到了复选框,radiobuttons和select元素(不是在DropDownListFor <>辅助方法的帮助下生成)没有正确值的问题 . 在回发表单时,我能够保存所有数据(复选框除外),我已正确输入数据库 . 但是当回读时,表单没有填充正确的值 - 选择了他们的第一个选项,单选按钮和复选框清除 . 问题的常见原因是value属性没有正确的值 . 所以我会逐一触摸它们 .

    • 在视图中,一些select元素是使用DropDownListFor <>辅助方法创建的,而有些只是标记为普通html,将其名称与相应的模型属性的名称相匹配,如下所示:

    <select class =“select-normal”name =“ApplicationType”>

    <option value =“0”> - 选择 - </ option> <option value =“1”>投诉</ option> <option value =“2”>提案</ option> <option value =“3”>查询</ option> </选择>

    ApplicationType是自定义枚举类型 .

    public Enum ApplicationType{
         Complaint=1
         Proposal=2,
         Query=3
       }
    

    在编辑/插入模式下,所选选项很容易绑定到相应的属性,因为存在从数值到枚举的隐式转换 . 但是在读取时,模型属性值是枚举成员的名称,而不是其基础值 . 因此,如果ApplicationType是ApplicationType.Proposal MVC引擎将查找具有相同名称的元素并将找到我们的select . 然后它将尝试找到具有“Proposal”值而不是2的选项,并且它将找不到任何值 . 所以我们必须将值设置为枚举选项的名称,如下所示:

    <select class =“select-normal”name =“ApplicationType”>

    <option value =“0”> - 选择 - </ option> <option value =“Complaint”> Complaint </ option> <option value =“Proposal”> Proposal </ option> <option value =“Query”> Query </ option> </选择>

    但即便如此,也不足以选择正确的选项 . 问题是,对于要选择的选项,需要设置 selected 属性,如此 selected="selected" . 不幸的是,我无法在MVC 5.1中使用新的Html扩展方法来控制EnumDropDownListFor <>,您可以从here添加到您的项目中 . 此方法从枚举中生成html选择元素 . 在使用之前,您必须记住两件事:

    a)如果希望select显示用户友好名称,则需要使用Disaplay(Name =“Enum1 display text”)修饰enum选项b)默认情况下,该方法将option元素的值设置为底层值枚举 . 改变这个

    string value = Convert.ChangeType(field.GetValue(null), baseEnumType).ToString();
    

    对此

    string value=field.Name;
    

    将此代码添加到项目后,您唯一需要做的就是添加这一行代码

    @Html.EnumDropDownListFor(x => x.ApplicationType, new { @class = "select-normal" })
    

    但是,当然,如果你设法以某种方式控制选项的“选择性”,你仍然可以采用旧的方式 . 就是这样,你很高兴 .

    • 对于radiobuttons,我的错误是将值设置为Enum.GetHashCode() . 所以改变这一点

    @ Html.RadioButtonFor(x => x.PreferredReplyMethod,PreferredReplyMethod.Verbal.GetHashCode())

    这将解决问题

    @ Html.RadioButtonFor(x => x.PreferredReplyMethod,PreferredReplyMethod.Verbal.GetHashCode())

    • 虽然有复选框,情况有点不同 . 如果我像这样明确地将Model传递给Html.BeginForm方法

    @using(Html.Beginform( “SaveDocument”, “DocumentController”,模型))

    并调试动作方法我可以看到对应于复选框的模型属性(它们是所有类型 int )的值都为"0" . 因此,当他们能够找出原因时,因为如果我让MVC引擎隐含地通过模型,这个问题就会消失 .

    @using(Html.Beginform("SaveDocument","DocumentController"))
    

相关问题