请注意以下代码的预期行为
@Html.RadioButtonFor(x => x.MyEnumProperty, MyEnum.OptionOne)
@Html.RadioButtonFor(x => x.MyEnumProperty, MyEnum.OptionTwo)
@Html.RadioButtonFor(x => x.MyEnumProperty, MyEnum.OptionThree)
是
<input id="MyEnumeration" type="radio" value="Option1"
name="MyEnumeration"
data-val-required="The MyEnumeration field is required." data-val="true">
<input id="MyEnumeration" type="radio" value="Option2" name="MyEnumeration">
<input id="MyEnumeration" type="radio" value="Option3" name="MyEnumeration">
为什么?因为Html.SomethingFor(model => model.Property) 旨在为一个特定属性生成一个 html 元素。您使用它从一个属性创建多个元素的方式是不正确的。
此外,查看这 3 个单选按钮的 ID。它们几乎一样,不是吗?在 html 页面上具有相同 ID 的元素是否可以接受?绝对不!因此需要修复一些问题。
虽然我认为通过开发新的 Html 扩展方法(参考 2)更容易解决这个问题,但我尝试用另一种方式解决它(因为我太固执了!)。
首先,我们需要更改剃须刀代码:
<div>
@Html.RadioButtonFor(m => m.MyEnumeration, MyEnum.Option1, new { id = "m1" })
<label for="m1">
OPTION 1</label>
@Html.RadioButtonFor(m => m.MyEnumeration, MyEnum.Option2, new { id = "m2" })
<label for="m2">
OPTION 2</label>
@Html.RadioButtonFor(m => m.MyEnumeration, MyEnum.Option3, new { id = "m3" })
<label for="m3">
OPTION 3</label>
</div>
然后,一个 JavaScript/jQuery 魔法来解决我们的问题:
<script type="text/javascript">
$(function () {
$('[name=MyEnumeration]').each(function (index) { domAttrModified(this); });
});
function domAttrModified(obj) {
//$obj = $(obj);
$(obj).bind('DOMAttrModified', function () {
if ($(obj).attr('class').indexOf('input-validation-error') != -1)
$(obj).parent().addClass('input-validation-error');
else
$(obj).parent().removeClass('input-validation-error');
});
}
</script>
只要第一个单选按钮引发验证错误,此 JavaScript 代码就会将错误 css 类 (input-validation-error) 应用于单选按钮的父元素,即 <div> 元素。
并且只要验证错误消失(通过单击任何单选按钮元素),就会从父元素中删除错误样式。
它在 IE 和 FF 中运行良好,但不幸的是在 Chrome 中无法运行。原因是 Chrome 不支持 DOMAttrModified 事件。我们可以使用这个解决方案来修复它:https://stackoverflow.com/a/10466236/538387,但可能会晚一点。
再次,我认为我们需要开发一种 HTML 扩展方法或改进和使用 EditorTemplate,如下所示:https://gist.github.com/973482
参考资料:
- https://stackoverflow.com/a/7098541/538387
- https://stackoverflow.com/a/3448675/538387
- https://gist.github.com/973482
- Event detect when css property changed using Jquery