2017-03-05 41 views
0

在我的MVC查看我有幾個複選框:檢查複選框被選中MVC控制器

<form method="POST" id="formRegistration" action="Registration/SubmitRegistration" > 
//Other code... 
    <input name="test1" type="checkbox" /> 
    <input name="test2" type="checkbox" /> 
</form> 

在控制器我GET-使用POST要求─數據,我把它插入到數據庫:

public void AddRegistered(Registration r) 
{ 
//Other code... 
    dParameters.Add("test1", r.test1.ToString()); 
    dParameters.Add("test2", r.test2.ToString()); 
//Other code... 
} 

問題是,即使複選框被選中,我仍然收到false的值。

Wham am我錯過?

+0

使用'Html.CheckBoxFor'而不是使用手動HTML。 – Dai

+0

這是使用手動HTML的要求,我不能使用Razor。 – user3378165

+0

複選框發回它的控件的值被檢查(如果沒有檢查,則沒有任何設置。你的設置值=「false」',所以它可以提交的都是'false'。如果你不使用'HtmlHelper'方法,那麼不要打擾使用mvc,因爲你永遠不會得到正確的模型綁定。 –

回答

1

所以你應該做的第一件事就是看看使用chrome調試工具或類似工具發送到服務器的實際數據。您可能會發現,如果選中,您的複選框值將被設置爲on,否則如果未選中,它將會完全丟失。

評論中的一個建議是@Html.CheckBoxFor,但是這也會遭遇這樣的事實:如果複選框未被檢查並且在特定情況下仍然可能成爲問題,則不會發送任何消息。

你有兩個解決方案 - 修復它在客戶端,或修復它在服務器上。

修復它在客戶端上
要做到這一點,你需要(用JavaScript)添加一個隱藏字段每一個複選框。原諒我,我不是一個編輯器來測試它,但它可能看起來像這樣(從內存中):

$('input[type="checkbox"]').each(function(el) { 
    var hidden = $('<input type="hidden" />'); 
    hidden.name = el.name; 
    el.after(hidden); 
    el.on("change", function(el) { 
     hidden.value = el.checked ? "true" : "false"; 
    }); 
}); 

修復它在服務器上:
要做到這一點,你會需要創建一個自定義PropertyBinder,它將on識別爲布爾型true。這將設置在屬性屬性級別上。您可以替代覆蓋全球ModelBinder來做到這一點,所以你不需要專門註釋一個屬性,使其工作。


就個人而言,我更喜歡「修復它在客戶端上」的方法,因爲你會得到兩種truefalse回發到每一個是你所期望的最接近的方式時間服務器HtmlHelper這樣做。

+0

_nothing將被髮送,如果複選框未取消check_簡直是錯的! - '@ Html.CheckBoxFor()'正確地生成2個輸入,一個複選框,其值爲'True'並且一個隱藏的輸入'value ='False'' –

+0

也許你說的對,我無法檢查現在 - 但是我不得不拋棄'HtmlHelper',並且之前手動執行此操作,因爲我沒有將虛假值發回到服務器。可能是單獨的問題,不確定。 – caesay

+0

感謝您的明確解釋! – user3378165

0

你缺少value屬性:

<input name="test1" type="checkbox" value="true" /> 
<input name="test2" type="checkbox" value="true" /> 

就這麼簡單。

0

如果你不想使用HtmlHelper類,你可以像這樣

<form method="POST" id="formRegistration" action="Registration/SubmitRegistration" > 

<input name="test1" type="checkbox" value="@Model.test1" /> 
<input name="test2" type="checkbox" value="@Model.test2" /> 

TEST1和TEST2應該在你的模型類。

+0

您可以也可以做'' - 儘管這對嵌套/子視圖或複雜視圖模型不起作用。 – Dai