我的复选框正在更新数据库,但在刷新时,“已检查”值不存在。
<input type="checkbox" id="chkPriorityOnly" @if(Model.PriorityOnly){<text> checked="checked" </text>}/> Priority Only <br />
然后按照建议,我用了:
@Html.CheckBoxFor(model => Model.PriorityOnly, new { id = "chkPriorityOnly" }) Priority Only<br />
这是保存选择时的html:
<input id="chkPriorityOnly" name="PriorityOnly" type="checkbox" value="true" /><input name="PriorityOnly" type="hidden" value="false" /> Priority Only<br />
这是我的保存:
function OnRestrictionsSaveClick() {
$.ajax({
type: 'POST',
url: '@Url.Content("~/Audience/UpdateRestrictions?audienceID=" + Model.AudienceID)'
+ '&priorityOnly=' + $('#chkPriorityOnly:checked').val()
+ '&home=' + $('#chkHome:checked').val()
+ '&work=' + $('#chkWork:checked').val()
+ '&cell=' + $('#chkCell:checked').val()
+ '&text=' + $('#chkText:checked').val()
+ '&other=' + $('#chkOther:checked').val() ,
success: function (data) {SaveRestrictionsResponse(data); }
});
}
答案 0 :(得分:1)
为什么不使用Html.CheckboxFor
方法?
@Html.CheckBoxFor(model => model.PriorityOnly) Priority Only<br />
至少可以说,你正在进行AJAX保存的方式很糟糕。你正在指定POST但是构建一个查询字符串,这很奇怪。
相反,请尝试:
function OnRestrictionsSaveClick() {
$.post({
url: '@Url.Action("UpdateRestrictions", "Audience")',
data: $("input:checkbox").serialize(),
success: function(data) { SaveRestrictionsResponse(data); }
});
}
这样,jQuery可以为您构建POST请求数据,自动获取所有选中复选框的值。未检查 not 的复选框将不会被发送,因此传递给UpdateRestrictions()操作的viewmodel应将所有布尔属性默认为“false”(模型绑定器将自动将选中的属性设置为“真”。)
此外,您可以使用Url.Action
方法生成所需操作的网址。您永远不应该将URL硬编码为操作。始终使用UrlHelper
或HtmlHelper
路由感知方法之一来构建这些网址。这是因为他们会尊重您的路由表,因此您可以轻松更改路线,而无需更改视图中的网址。
答案 1 :(得分:1)
我不知道这是否会回答您的问题,但您在javascript中所做的事情是不正确的。
$(“*:checked”)选择器将查找选中的复选框。
含义如果未选中复选框,$(“#chkHome:checked”)将返回null。
Uing .val()将检索输入的value属性。调用$(“#chkHome:checked”)。val()将返回“true”(输入的value属性),如果已选中,则返回null。
你应该使用$(“#chkHome”)。is(“:checked”)(如果选中则返回true,否则返回false)。
没有隐藏的输入,而是使用:
<input type="checkbox" name="chkPriorityOnly" id="chkPriorityOnly" @(Model.PriorityOnly ? "checked=checked" : "") value="true" />
<label for="chkPriorityOnly">Priority only</label>
如果name属性与模型上的属性名称(例如PriorityOnly vs chkPriorityOnly)匹配用于数据绑定目的,也可能更好。
答案 2 :(得分:0)
当表单发布时,仅发布已选中的复选框。因为Html.CheckBoxFor有隐藏字段:当未选中复选框时,隐藏字段的错误值被发布而不是任何内容(注意隐藏字段与复选框具有相同的名称)
试试这个:
+ '&priorityOnly=' + $('#chkPriorityOnly').val()
而不是:
+ '&priorityOnly=' + $('#chkPriorityOnly:checked').val()