2011-05-09 125 views

回答

25

這是因爲CheckBox助手生成具有相同名稱的複選框額外的隱藏字段(您可以通過瀏覽生成的看到它源代碼):

<input checked="checked" id="Visible" name="Visible" type="checkbox" value="true" /> 
<input name="Visible" type="hidden" value="false" /> 

所以兩個值都是在您提交表單時發送給控制器操作。下面是解釋這背後更多的隱藏字段的推理從ASP.NET MVC源代碼直接評論:

if (inputType == InputType.CheckBox) { 
    // Render an additional <input type="hidden".../> for checkboxes. This 
    // addresses scenarios where unchecked checkboxes are not sent in the request. 
    // Sending a hidden input makes it possible to know that the checkbox was present 
    // on the page when the request was submitted. 
    ... 

而不是使用FormCollection我將使用視圖模型作爲操作參數或直接標量類型建議你,離開的麻煩解析爲默認模型聯編程序:

public ActionResult SomeAction(bool visible) 
{ 
    ... 
} 
+0

瀏覽器有責任發送或不發送複選框值來請求?爲什麼? – Jalal 2011-05-09 11:40:34

+0

如果我直接在View中使用''怎麼辦? – Jalal 2011-05-09 11:41:28

+0

@Jalal Amini,如果你想避免使用這個隱藏字段,你可以直接在視圖中使用''。 – 2011-05-09 12:12:48

1

我有同樣的問題。我用下面的組合固定它(與達林季米特洛夫一點幫助 - 謝謝):

VIEW:

<label for="optIn"><%=Html.CheckBox("optIn", ViewData["OptIn"])%> 

控制器:

public ActionResult Index() 
{ 
    ViewData["Optin"] = True; 
} 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(FormCollection form, bool OptIn) 
{   
    ViewData["Optin"] = OptIn; 
} 

這是一個有控制源並且沒有實際檢查的複選框(供參考):

選中:

<input Length="4" checked="checked" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" /> 

未選中:

<input Length="4" id="optIn" name="optIn" type="checkbox" value="true" /><input name="optIn" type="hidden" value="false" /> 

所以,這裏是我如何解釋我的行爲:如果該複選框未被選中,但會後回來,如果它是

HTML不會回發的字段值。該輔助程序在複選框控件(值爲'False')後附加一個隱藏字段。如果複選框被選中,則源代碼顯示「checked ='選中'」,如果未選中,則不顯示。所以,如果checked = checked,則true傳回給控制器。如果該框未被選中,則控制權不會被傳回,因此被命名爲相同的隱藏字段接管並返回false。這樣你有兩個條件。奇怪,但它的作品。我希望這有幫助。

9

我最近處理了這個問題,並提出了一種繞過MVC綁定並在查詢字符串上使用Contains(「true」)的方法。沒有別的爲我工作。

如果人們堅持與其他的答案,那麼這是對我工作 - http://websitesorcery.com/post/2012/03/19/CheckBox-Issue-with-MVC-3-WebGrid-Paging-Sorting.aspx

+1

之下發布了我的解決方案。我也這樣做了。用複選框消磨時間 – Sakthivel 2013-06-17 07:06:47

+1

謝謝你的幫助。 – 2013-12-31 12:35:40

2

如果你想/需要使用FormCollection,不是檢查truefalse,檢查true,falsefalse

例如而不是這個

adslService.Visible = bool.Parse(collection["Visible"]); 

做到這一點

adslService.Visible = bool.Parse(collection["Visible"] != "false"); 
+0

此解決方案提供了一個錯誤:「不能將'bool'轉換爲'字符串'」 – 2013-02-27 10:16:38

+0

應該是: 'adslService.Visible = collection [「Visible」]!=「false」;' – 2014-01-30 02:05:16

2

我有同樣的問題在MVC 4,

該解決方案爲我工作。

我的(形式)查看:

@Html.EditorFor(m => m.SomeBoolValue) 

對於排尿重複 「真,假」 值時,複選框是真的

我儲存的複選框PARAM中的數組:

var arrParams = Request.Form["SomeBoolValue"].Split(','); 

抓住第一個元素:

string sParam = arrParams[0].ToString(); 

解析它:

bool BoolValue = bool.Parse(sParam); 

保持它:

MyObject.SomeBoolValue = BoolValue; 
0

的MVC Entension對Html.Checkbox的默認行爲,生成一個隱藏字段與它一起被張貼。 在我的情況下,因爲我添加到頁面的自定義複選框不是像Html.CheckBoxFor那樣綁定模型,所以我決定將它作爲簡單的html複選框。

<input type="checkbox" name="WithAttachment" checked="checked"/> Include Attachments

這聽起來可能很傻,但將節省別人的時間比變通後運行。這將創建一個複選框使用MVC擴展

0

防止我已經有我到處使用來處理布爾類型的文本,並返回true或false靜態函數作爲一個布爾所以我只照顧它有

  if (sBool.StartsWith("true,")) bReturn = true;//cater for mvc checkboxes 

      else if (sBool == "true") bReturn = true; 

      else if (sBool == "t") bReturn = true;//t-f 

      else if (sBool == "1") bReturn = true;//1-0 

      else if (sBool == "yes") bReturn = true;//yes-no 

      else if (sBool == "y") bReturn = true;//y-n 

      else if (sBool == "on") bReturn = true;//on-off 
相關問題