0

我的复选框正在更新数据库,但刷新时“已检查”值不存在。

<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); }
            });
}
4

3 回答 3

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 请求数据的繁重工作,自动获取所有选中复选框的值。不会发送未选中的复选框,因此传递给 UpdateRestrictions() 操作的视图模型应默认所有布尔属性为“false”(模型绑定器将自动将选中的属性设置为“true”。)

此外,您可以使用该Url.Action方法为您想要的操作生成 URL。您永远不应该将 URL 硬编码为操作。始终使用其中一种UrlHelperHtmlHelper路由感知方法来构建这些 URL。这是因为它们会尊重您的路由表,因此您可以轻松更改路由,而无需更改视图中的 URL。

于 2012-04-27T17:38:41.690 回答
1

我不知道这是否会回答您的问题,但是您在 javascript 中所做的事情是不正确的。

$("*:checked") 选择器将查找选中的复选框。

意思是 $("#chkHome:checked") 如果未选中复选框,将返回 null 。

使用 .val() 将检索输入的值属性。如果已检查,则调用 $("#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 与 chkPriorityOnly)用于数据绑定,它也可能更好。

于 2012-04-27T19:54:31.483 回答
0

当表单发布时,仅发布选中的复选框。并且因为 Html.CheckBoxFor 有隐藏字段:当未选中复选框时,隐藏字段的 false 值会被发布而不是什么都没有(注意隐藏字段与复选​​框具有相同的名称)

试试这个:

+ '&priorityOnly=' + $('#chkPriorityOnly').val()

而不是这个:

+ '&priorityOnly=' + $('#chkPriorityOnly:checked').val()
于 2012-04-27T18:56:30.400 回答