在客户端将 MVC 复选框设置为只读(或禁用)
Set MVC checkbox to readonly (or disabled) on client-side
我们有几个 MVC 复选框,例如:
@Html.CheckBoxFor(model => model.hasData, …)
我们有条件客户端代码需要将 div 中的所有控件设置为只读(包括这些复选框):
if (someCondition) {
$('#' + divIdToDisable + ' input').attr('readonly', 'true');
}
我们了解到 readonly 在复选框上无法正常工作(见下文)。
我尝试了以下方法,但这会导致在“保存”期间没有数据回传(另见下文):
$('#' + divIdToDisable + ' input').attr('disabled', 'true');
这似乎是一个常见问题,但在我的所有研究中,我还没有找到好的 客户端 解决方案。
这是我的研究:
复选框只读并不总是适用于所有浏览器:
Can HTML checkboxes be set to readonly?
How can I make a checkbox readonly? not disabled?
在 MVC 中使用“禁用”会导致没有值被回发:
Html.CheckBox returns false if disabled, even if seleced
http://davecallan.com/posting-disabled-checkboxes-mvc-razor-views/
可以在剃须刀代码中实现条件“禁用”:
Asp .net mvc 3 CheckBoxFor method outputs hidden field, that hidden field value is false when checkbox is disabled with selected true
MVC 3: Conditionally Adding the Disabled Attribute with the HtmlHelpers
然而,这些不是客户端解决方案。
编辑:尽管在看到 ZiNNED 的不错的解决方法后我的回答似乎有点老套,但仍然重要的是要注意您遇到此问题的原因。
这是因为您在 div 中禁用了 ALL 输入。复选框会发生 两个 ipnuts 被创建。一个是隐藏的。这是因为如果 checked
属性不存在,则不会向服务器发送任何数据。解决方法是我们隐藏的输入。这将始终以 false 值存在,因此当表单 posts 带有未选中的复选框时,false 仍作为该复选框的值发送到服务器。
要解决您的问题,您需要专门针对复选框输入。例如
$('#' + divIdToDisable + ' input[type="checkbox"]').attr('disabled', true);
这将允许来自隐藏输入的 false 仍然被 posted。如果你需要 post true,你可以将 hidden 的值更改为 true。例如(假设每个 div 只有一个复选框)
$('#' + divIdToDisable + ' input[type="hidden"]').val(true);
禁用
$('#' + divIdToDisable + ' input').removeAttr("disabled");
启用
$('#' + divIdToDisable + ' input').attr("disabled", true);
您可以创建一个 readOnly
CSS class,然后将其应用于您需要设为只读的复选框。像这样...
.readOnly{
pointer-events: none;
color: #CCC000;
}
这会产生复选框被禁用的效果,并且不允许点击,但仍然 POST 通过表单的值。
如果您希望将禁用的复选框中的数据发送到服务器,只需在 post 之前将它们的状态设置为 enabled
。所以,在 jQuery 中,你可以这样做:
$("form").on("submit", function(e)
{
$("input:checkbox").prop("disabled", false);
});
我们有几个 MVC 复选框,例如:
@Html.CheckBoxFor(model => model.hasData, …)
我们有条件客户端代码需要将 div 中的所有控件设置为只读(包括这些复选框):
if (someCondition) {
$('#' + divIdToDisable + ' input').attr('readonly', 'true');
}
我们了解到 readonly 在复选框上无法正常工作(见下文)。
我尝试了以下方法,但这会导致在“保存”期间没有数据回传(另见下文):
$('#' + divIdToDisable + ' input').attr('disabled', 'true');
这似乎是一个常见问题,但在我的所有研究中,我还没有找到好的 客户端 解决方案。
这是我的研究:
复选框只读并不总是适用于所有浏览器:
Can HTML checkboxes be set to readonly?
How can I make a checkbox readonly? not disabled?
在 MVC 中使用“禁用”会导致没有值被回发:
Html.CheckBox returns false if disabled, even if seleced
http://davecallan.com/posting-disabled-checkboxes-mvc-razor-views/
可以在剃须刀代码中实现条件“禁用”:
Asp .net mvc 3 CheckBoxFor method outputs hidden field, that hidden field value is false when checkbox is disabled with selected true
MVC 3: Conditionally Adding the Disabled Attribute with the HtmlHelpers
然而,这些不是客户端解决方案。
编辑:尽管在看到 ZiNNED 的不错的解决方法后我的回答似乎有点老套,但仍然重要的是要注意您遇到此问题的原因。
这是因为您在 div 中禁用了 ALL 输入。复选框会发生 两个 ipnuts 被创建。一个是隐藏的。这是因为如果 checked
属性不存在,则不会向服务器发送任何数据。解决方法是我们隐藏的输入。这将始终以 false 值存在,因此当表单 posts 带有未选中的复选框时,false 仍作为该复选框的值发送到服务器。
要解决您的问题,您需要专门针对复选框输入。例如
$('#' + divIdToDisable + ' input[type="checkbox"]').attr('disabled', true);
这将允许来自隐藏输入的 false 仍然被 posted。如果你需要 post true,你可以将 hidden 的值更改为 true。例如(假设每个 div 只有一个复选框)
$('#' + divIdToDisable + ' input[type="hidden"]').val(true);
禁用
$('#' + divIdToDisable + ' input').removeAttr("disabled");
启用
$('#' + divIdToDisable + ' input').attr("disabled", true);
您可以创建一个 readOnly
CSS class,然后将其应用于您需要设为只读的复选框。像这样...
.readOnly{
pointer-events: none;
color: #CCC000;
}
这会产生复选框被禁用的效果,并且不允许点击,但仍然 POST 通过表单的值。
如果您希望将禁用的复选框中的数据发送到服务器,只需在 post 之前将它们的状态设置为 enabled
。所以,在 jQuery 中,你可以这样做:
$("form").on("submit", function(e)
{
$("input:checkbox").prop("disabled", false);
});