MVC3中的复选框无法从模型中刷新

时间:2012-04-27 17:34:14

标签: c# asp.net-mvc asp.net-mvc-3

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

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

3 个答案:

答案 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硬编码为操作。始终使用UrlHelperHtmlHelper路由感知方法之一来构建这些网址。这是因为他们会尊重您的路由表,因此您可以轻松更改路线,而无需更改视图中的网址。

答案 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()