【问题标题】:Checkbox is checked but value not passed to controller in asp.net mvc复选框已选中,但值未传递给 asp.net mvc 中的控制器
【发布时间】: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 标记中我刚刚添加它是为了显示我如何使用此方法显示开关类型复选框。是的,最初我希望我的复选框选中(打开),但用户可以将其更改为未选中(关闭)等。
  • 刚刚将您的代码复制到我的测试项目中,我无法重现您的问题。无论我点击多少次&lt;div class="checkSwitch" ..&gt;,每次都能正常工作注意我刚刚添加了&lt;style .on {background-color: green;} .off {background-color: red;}&lt;/style&gt;。我注意到的是,尽管将类名从on 切换到off(反之亦然),但单击&lt;div&gt; 的某些部分并没有切换实际的复选框状态。我建议您取消隐藏真正的复选框并查看它的实际效果,因为我怀疑这是问题所在。
  • 我已经确认,如果你使用 prop('checked', true) 而不是 attr('checked', 'checked'); 和 prop('checked', false)` 而不是 removeAttr('checked'); 那么它应该可以按预期工作(PeterKA 刚刚包含了这个在他的编辑中)。请注意,您还应该从帮助程序中删除@checked = "checked",而是在将模型传递给视图之前,在控制器(或模型默认构造函数)中将属性ENABLED 的值设置为true

标签: jquery asp.net-mvc checkbox model-binding


【解决方案1】:

那是因为你有一个隐藏的input 字段,同名ENABLED,它有一个固定值false

<input type="hidden" name="ENABLED" value="false"> <!-- THIS IS THE CAUSE -->

<input id="ENABLED" class="CheckSwitch" type="checkbox" value="true" name="ENABLED" checked="checked">

还建议使用.prop() 而不是.attr().removeAttr();因此使用

$this.children('input.checkSwitch').prop('checked', true);
//instead of $this.children('input.checkSwitch').attr('checked', 'checked'); and

$this.children('input.checkSwitch').prop('checked', false);
//instead of $this.children('input.checkSwitch').removeAttr('checked');

【讨论】:

  • 感谢重播。实际上,这个隐藏字段是由 Html.CheckBoxFor 辅助方法添加的,以在复选框为 Off(未选中)和复选框为 On(选中)值为 true 时传递 false 值,根据此链接 mindstorminteractive.com/topics/… 传递 false。但在我的情况下,当复选框更改超过一次时,它只传递 false,这是复选框的奇怪行为。
  • 是什么控制了这个隐藏输入的值?
  • 这个隐藏字段保持原样。我没有改变它在代码中的价值。
  • 当提交错误的值时,您至少可以在生成的 HTML 中检查它的值。在我看来,任何应该改变该值的东西都被破坏了。
  • 隐藏字段值保持不变,即为 False。只是属性checked="checked" 在复选框字段打开(选中)时添加到复选框字段,并在关闭(未选中)时删除。
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2013-09-22
  • 2019-08-09
  • 2018-12-15
相关资源
最近更新 更多