MVC3 中的复选框不会从模型中刷新

本文关键字:模型 刷新 复选框 MVC3 | 更新日期: 2023-09-27 18:32:32

我的复选框正在更新数据库,但在刷新时"选中"值不存在。

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

MVC3 中的复选框不会从模型中刷新

我不知道

这是否会回答你的问题,但你在javascript中所做的是不正确的。

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

这意味着 $("#chkHome:checked") 如果未选中该复选框,将返回 null。

Uing .val() 将检索输入的值属性。如果选中 $("#chkHome:checked").val(),则返回 "true"(输入的值属性),否则为 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),也可能更好。

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

此外,还可以使用 Url.Action 方法为所需操作生成 URL。切勿将 URL 硬编码到操作。始终使用UrlHelperHtmlHelper路由感知方法之一来构建这些 URL。这是因为它们将遵循您的路由表,因此您可以轻松更改路由,而无需更改视图中的 URL。

当表单发布时,仅发布选中的复选框。并且由于Html.CheckBoxFor具有隐藏字段:如果未选中复选框,则会发布隐藏字段的假值而不是任何内容(请注意,隐藏字段与复选框同名)

试试这个:

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

取而代之的是:

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