【发布时间】:2014-12-29 03:41:03
【问题描述】:
我在 ASP.Net MVC 中开发应用程序并遇到奇怪的问题。在我看来,我将复选框显示为这样的开/关开关:
为此,我使用以下 jquery 代码
function checkSwitch()
{
$('input.checkSwitch').each(function() {
if($(this).attr('checked') == 'checked'){
$(this).wrap('<div class="checkSwitch on" />');
} else {
$(this).wrap('<div class="checkSwitch off" />');
}
$(this).parent('div.checkSwitch').each(function() {
$(this).append('<div class="checkSwitchInner"><div class="checkSwitchOn">On</div><div class="checkSwitchHandle"></div><div class="checkSwitchOff">Off</div></div>');
});
});
}
$(document).on('click', 'div.checkSwitch', function() {
var $this = $(this);
if($this.hasClass('off')){
$this.addClass('on');
$this.removeClass('off');
$this.children('input.checkSwitch').attr('checked', 'checked');
} else if($this.hasClass('on')){
$this.addClass('off');
$this.removeClass('on');
$this.children('input.checkSwitch').removeAttr('checked');
}
});
在视图中显示复选框的 HTML 代码如下:
<script>
checkSwitch();
</script>
@Html.CheckBoxFor(model => model.ENABLED, new { @class = "checkSwitch", @checked = "checked" })
这里 ENABLED 是模型中的布尔字段,如下所示:
public bool ENABLED { get; set; }
在浏览器中生成的这个视图的html代码是这样的:
现在,当我打开视图时,复选框显示为 On/Off 开关,当我将复选框设置为 On(选中)到 Off(未选中)或 Off(未选中)到 On(选中)(即仅单击一次)并提交表单,将正确的值发布给控制器。但是,当我单击不止一次以将复选框状态(例如 On(选中)更改为 Off(未选中)再次更改为 On(选中)或单击任意次数并最终将其设为 On(选中)时,它每次都会向控制器发布错误消息。我不知道为什么会这样。根据上面的 jquery 代码,它在打开(选中)时选中复选框。我交叉检查了它在 FireBug 中的工作,它在复选框被选中(打开)时添加了属性 Checked="Checked",并在未选中(关闭)时删除了属性。我无法找出为什么它没有发布真实的原因,即使当它被点击超过一次时复选框被选中(打开)。请告诉我代码有什么问题。
谢谢...
【问题讨论】:
-
我不认为这是问题所在,但您的代码在
@Html.CheckBoxFor()之前有脚本。那是对的吗?在帮助程序中,您的设置@checked = "checked"意味着始终检查初始值,而不管属性ENABLED的值如何? -
其实是javascript代码行 出现在我的页面的 head 标记中我刚刚添加它是为了显示我如何使用此方法显示开关类型复选框。是的,最初我希望我的复选框选中(打开),但用户可以将其更改为未选中(关闭)等。
-
刚刚将您的代码复制到我的测试项目中,我无法重现您的问题。无论我点击多少次
<div class="checkSwitch" ..>,每次都能正常工作注意我刚刚添加了<style .on {background-color: green;} .off {background-color: red;}</style>。我注意到的是,尽管将类名从on切换到off(反之亦然),但单击<div>的某些部分并没有切换实际的复选框状态。我建议您取消隐藏真正的复选框并查看它的实际效果,因为我怀疑这是问题所在。 -
我已经确认,如果你使用
prop('checked', true)而不是attr('checked', 'checked');和 prop('checked', false)` 而不是removeAttr('checked');那么它应该可以按预期工作(PeterKA 刚刚包含了这个在他的编辑中)。请注意,您还应该从帮助程序中删除@checked = "checked",而是在将模型传递给视图之前,在控制器(或模型默认构造函数)中将属性ENABLED的值设置为true。
标签: jquery asp.net-mvc checkbox model-binding