我有不同类型的元素 - 我的视图上的文本框,选择,复选框和单选按钮 . 当我使用模型呈现这个强类型视图时,有一些元素会填充相应的模型值,但有某些类型和不存在的类型 . 单选按钮,复选框为空白 . 当涉及到选择元素时,如果它们是使用 @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 回答
我终于找到了问题的原因 . 因此,当你阅读时, grab 你的咖啡(当然是那些像我一样不熟悉ASP.NET MVC模型的人) . 正如我所说,我遇到了复选框,radiobuttons和select元素(不是在DropDownListFor <>辅助方法的帮助下生成)没有正确值的问题 . 在回发表单时,我能够保存所有数据(复选框除外),我已正确输入数据库 . 但是当回读时,表单没有填充正确的值 - 选择了他们的第一个选项,单选按钮和复选框清除 . 问题的常见原因是value属性没有正确的值 . 所以我会逐一触摸它们 .
<option value =“0”> - 选择 - </ option> <option value =“1”>投诉</ option> <option value =“2”>提案</ option> <option value =“3”>查询</ option> </选择>
ApplicationType是自定义枚举类型 .
在编辑/插入模式下,所选选项很容易绑定到相应的属性,因为存在从数值到枚举的隐式转换 . 但是在读取时,模型属性值是枚举成员的名称,而不是其基础值 . 因此,如果ApplicationType是ApplicationType.Proposal MVC引擎将查找具有相同名称的元素并将找到我们的select . 然后它将尝试找到具有“Proposal”值而不是2的选项,并且它将找不到任何值 . 所以我们必须将值设置为枚举选项的名称,如下所示:
<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元素的值设置为底层值枚举 . 改变这个
对此
将此代码添加到项目后,您唯一需要做的就是添加这一行代码
但是,当然,如果你设法以某种方式控制选项的“选择性”,你仍然可以采用旧的方式 . 就是这样,你很高兴 .
@ Html.RadioButtonFor(x => x.PreferredReplyMethod,PreferredReplyMethod.Verbal.GetHashCode())
这将解决问题
@using(Html.Beginform( “SaveDocument”, “DocumentController”,模型))
并调试动作方法我可以看到对应于复选框的模型属性(它们是所有类型
int
)的值都为"0" . 因此,当他们能够找出原因时,因为如果我让MVC引擎隐含地通过模型,这个问题就会消失 .