2012-04-27 33 views
0

刷新我的複選框正在更新數據庫,但刷新時「checked」值不存在。MVC3中的複選框不從型號

<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

爲什麼不做一個'@ Html.CheckBoxFor(x => x.PriorityOnly)'?另外,你有沒有確定你的模型中的價值是真的?您可能會更新數據庫,然後返回其他內容。 – Tejs 2012-04-27 17:36:09

回答

1

我不知道這是否會回答你的問題,但你在做什麼在JavaScript中是不正確的。

$(「*:checked」)選擇器將查找選中的複選框。

含義$(「#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 VS chkPriorityOnly)用於綁定的目的屬性名稱。

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。您絕不應該將網址硬編碼爲操作。始終使用UrlHelperHtmlHelper路由感知方法之一來構建這些URL。這是因爲他們會尊重您的路由表,所以您可以輕鬆更改路由,而無需更改視圖中的URL。

+0

謝謝,我試過並編輯過我的帖子。我猜隱藏的錯誤是正常的,而不是問題。我將發佈我的代碼的其餘部分。 – 2012-04-27 18:55:01

+0

@SteveJones請根據您更新的問題查看我更新的答案。 – 2012-04-27 23:35:24

+0

非常酷,謝謝! – 2012-04-30 13:57:41

0

當表單發佈時,只發布選中的複選框。正因爲如此Html.CheckBoxFor已隱藏字段:如果未選中的複選框,隱藏字段的值爲false張貼的,而不是什麼(請注意,隱藏字段具有相同的名稱複選框)

,並嘗試這個辦法:

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

,而不是這樣的:

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