微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以创建与其他内置帮助器一致的可重用Html.CheckboxesFor <enum>帮助器

如何解决是否可以创建与其他内置帮助器一致的可重用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 举报,一经查实,本站将立刻删除。