如何解决是否可以创建与其他内置帮助器一致的可重用Html.CheckboxesFor <enum>帮助器
我正在尝试创建一个HTML帮助器以显示枚举的一组复选框,并将这些值绑定到我的视图模型上的List<enum>
。
大多数情况都很好,我们可以使用Enum.GetValues()
为枚举中的每个值生成复选框。例如对于此枚举和视图模型:
Enum Fruit {
Apple,Banana
}
Class Myviewmodel {
public List<Fruit> Fruits { get; set; }
}
<input id="Fruits_Apple" name="Fruits" type="checkBox" value="Apple">
<input id="Fruits_Banana" name="Fruits" type="checkBox" value="Banana">
并且当用户提交表单时,模型绑定器将正确绑定东西。
我遇到的问题是如何处理未选中复选框的情况,我们需要重新显示页面(例如,由于另一个字段的验证失败)。
在这种情况下,内置的HTML帮助程序将使用ModelState
(而不是视图模型)中的数据重新显示。只要选中集合中的至少一个复选框,这对我的代码也可以正常工作。但是,当未选中任何复选框时,该字段将不发送任何内容到浏览器,因此Fruits字段没有ModelState
值,因此帮助程序将退回到视图模型数据(可能与视图模型数据不匹配)。刚刚选择的用户)。
内置的CheckBoxFor()
方法通过在页面中包含设置为false的隐藏字段来解决此问题。这意味着ModelState
始终至少包含一个false
值,有时还包含一个false
和一个true
。当两个值都存在时,模型联编程序将视图模型上的值设置为true。
我尝试将隐藏字段添加到我的复选框列表中:
<input id="Fruits_Apple" name="Fruits" type="checkBox" value="Apple">
<input id="Fruits_Banana" name="Fruits" type="checkBox" value="Banana">
<input name="Fruits" type="hidden" value="hidden_checkBox_dummy_value">
这确保始终有ModelState
,但是ModelBinder无法将hidden_checkBox_dummy_value
映射到值Fruit
,所以我们得到了一个例外。
已经全部写完了,我现在怀疑我的前进之路是研究自定义模型联编程序以忽略虚拟值,但是经过足够的研究,我认为这个问题将来可能对其他人仍然有用。 / p>
确认自定义模型活页夹将/将不起作用,否则将对前进的方式提出其他建议。
请注意,为枚举添加额外的值不是我可以使用的解决方案,因为它会使重用变得过于混乱。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。