2011-09-29 85 views
12

如果未选中复选框,则单击表单提交按钮不会提交任何数据。如何提交未勾选的复选框

根据用户选择的表单域,某些复选框可能不在表单中。因此,提交控制器无法确定未选中的复选框是否存在于表单中。

如果数据库对此列包含true,则此属性不会更新为false。 复选框名称与数据库布尔列名称相同。

如何强制表单提交复选框这是在未选中状态或任何其他想法 设定值在数据库为假,如果复选框未被选中,但不要在数据库中更改值,如果复选框中不存在的形式?

的jQuery,jQueryUI的,asp.net MVC 2使用

回答

10

这与HTML表单复选框常见的问题,是不是唯一的ASP.NET。

答案是每个复选框都有一个隐藏字段。当复选框被修改时,使用客户端事件来更新隐藏字段。

隐藏字段将始终提交。

但是,由于您使用的是ASP.NET MVC,如果您使用HTML.CheckBoxFor帮助程序,它会自动为您处理。

+0

@Thank你,这解决了问题。我在MVC2中生成动态表单,比如'void RenderFormField(StringBuilder sb){switch type(col.ColumnType) {ColumnType.Boolean: sb.AppendFormat(““,col.PropertyName); sb.AppendFormat( “ Andrus

+0

@Andrus,我建议你使用上述'HTML.CheckBoxFor'创建一个普通视图,并复制生成的HTML(并确保你赶上任何JavaScript包含)。但是,作为一般规则,我会尽量避免以这种方式生成表单。如果您想调查其他选项,也许值得打开另一个问题,详细说明您想要实现的目标。祝你好运! –

+0

为什么客户端事件需要? http://stackoverflow.com/questions/5102544/set-unchecked-value-of-checkbox答案写道,没有更多要求,具有相同名称的隐藏元素就足够了,因为它总是会overrridden!? – Andrus

6

这是一个非常普遍的问题 - 当复选框没有被选中时,它不会自动发送到服务器值off/false。我发现的最常见的答案是添加与复选框同名的隐藏字段,并且value = false。但是当有人检查它时,它给了我两个值。

我不喜欢它。这是我做过什么:

某处在HTML:

<input type="checkbox" name="${name}" onclick="true" > 

jQuery中:

第一步是在未检查所有的复选框设置隐藏值。

$(document).ready(function() { 
     $(".checkbox").each(function() { 
       if ($(this).prop("checked") == undefined) { 
        $(this).after("<input type=\"hidden\" name=\"" + $(this).attr("name") + "\" value="off">") 
       } 
       } 
     ) 
    }); 

其次,我们必须在用户点击复选框反应:当取消选择添加隐藏字段,选择时 - 在DOM中删除一个兄弟 - 我们预期的隐藏字段存在。

警告:当检查框有共同的父母,你应该检查是否一个同级的类型为隐藏,然后将其删除!:

$(".checkbox").click(function() { 
        if ($(this).prop("checked") == undefined) { 
         $(this).after("<input type=\"hidden\" name=\"" + $(this).attr("name") + "\" value=off>") 
        } else { 
         $(this).next().remove(); 
        } 
       } 
      ); 

而且它为我工作:)

+0

我upvoted你,因为这是一个优雅的解决方案的值。也许这对于.net来说并不是最好的,但我没有使用.net。然而,有几点需要注意:HTML中没有必要使用'onclick',这是一种糟糕的形式。此外,不幸的是,你的代码不太合适,至少在最新的jQuery(attr(“checked”)不起作用)。我会用我建议的改进(对我有用)编辑你的答案。感谢您的回答,这非常有帮助。 – Lambart

+0

我从来没有编辑拒绝到现在,但3次我试图纠正你的答案(attr - >道具),但它每次都被拒绝。欢迎来到Stack Overflow。我相信他们会让你纠正你的答案;请做。 – Lambart

+1

谢谢你的信息:)我编辑了我的答案。我也没有使用这个解决方案。网络,但我认为这个问题更全球化。 – Diaes

3

我最短解决办法:用一个复选框的平变化()事件到隐藏兄弟设置为0或1。作为如下:

var htm = '<input type="checkbox" '+(isMale>0?"checked":"")+' onchange="this.nextSibling.value=this.checked==true?1:0;" /><input type="hidden" name="Gender" value="'+isMale+'" />'; 

提交只发送hidd不是复选框,因为它没有名称属性。所以上面的序列化为“...& Gender = 1 ...“或”... & Gender = 0 ...“取决于isMale的值

0

我在使用jQuery/Java时遇到了类似的问题 - 不是使用额外的隐藏字段,我的形式保存,不论领域是否进行了修改,每一次被迫提交

例如,如果chkBox1 =unchecked(将发送空 - 通过jQuery的onClick或的onChange复选框的事件控制值属性)。

<input name="chkBox1 " class="editable-value" id="chkBox1 " style="display: inline;" type="checkbox" data-type="A" data-original-value="checked" data-force-save="true" value="N"/> 

ChkBox2=checked (会发Y)

<input name="ChkBox2" class="editable-value" id="ChkBox2" type="checkbox" CHECKED="Y" data-type="A" data-original-value="checked" value="Y"> 

是屏幕上的值,我尝试保存数据,在我的Java代码中,我对getter中获得的值执行null检查,并将null解释为'N'。 这可以避免隐藏字段的开销,尽管可以自由选择解决其特定情况的解决方案。

0

,我发现自己在这个问题最近,这就是我的解决方案。 我这样做没有隐藏的领域。 只需将复选框的“值”更改为“关闭”,并确保已将其选中以便发送。 注:我只测试了一个PHP服务器,但它应该工作。

 // Prepare checkboxes 
    var checkboxes = document.querySelectorAll('input[type="checkbox"]') 
    checkboxes.forEach(function(cbox) { 
     if (!cbox.checked) { // If the checkbox is checked it keeps its value, default value is 'on' 
      cbox.value='off' // Otherwise change the value to off, or something else 
      cbox.checked = true // We need to check it, so it sends the value 
     } 
    })