2012-07-09 111 views
0

當我檢查兩個複選框時,我得到「1」。當我檢查第一個複選框時,我得到「1」。當我只檢查第二個複選框時,我得到「false」。這是爲什麼?另外,如何讓其他複選框發佈其價值(或根本)?下面的代碼和結果HTML。爲什麼這個複選框[列表]返回1或錯誤?

@model InspectionWebFormsMVC.ViewModels.CtrlInputDataModel 

@{ 
    var ddv = new SelectList(Model.RowCtrl.DefaultValues, "Value", "Label"); 

    switch (Model.RowCtrl.Type) 
    { 
     case "checkbox": 
      foreach (var sli in ddv) 
      { 
       @Html.LabelFor(blah => blah.InputtedData, sli.Text) 

       bool isChecked = false; 
       string attrChecked = "checked"; 
       if (Model.InputtedData == sli.Value){ 
        isChecked = true; 
        @Html.CheckBox("InputtedData", isChecked, new { @value = sli.Value, @checked = attrChecked }) 
       } 
       else { 
        isChecked = false; 
        @Html.CheckBox("InputtedData", isChecked, new { @value = sli.Value }) 
       } 


      } 
       @Html.HiddenFor(blah => blah.InputtedDataID) 
       @Html.HiddenFor(blah => blah.RowCtrl.CtrlTypeID) 

       <br /> 
     break; 
    } 
} 

產生的HTML:

<label for="sectionRows_a7d91de2-c828-4cd4-979d-783caf85ae3b__RowInput_0__InputtedData">Red</label> 

<input id="sectionRows_a7d91de2-c828-4cd4-979d-783caf85ae3b__RowInput_0__InputtedData" 
     name="sectionRows[a7d91de2-c828-4cd4-979d-783caf85ae3b].RowInput[0].InputtedData" 
     type="checkbox" 
     value="1" /> 

<input name="sectionRows[a7d91de2-c828-4cd4-979d-783caf85ae3b].RowInput[0].InputtedData" 
     type="hidden" 
     value="false" /> 

<label for="sectionRows_a7d91de2-c828-4cd4-979d-783caf85ae3b__RowInput_0__InputtedData">Super</label> 

<input checked="checked" 
     id="sectionRows_a7d91de2-c828-4cd4-979d-783caf85ae3b__RowInput_0__InputtedData" 
     name="sectionRows[a7d91de2-c828-4cd4-979d-783caf85ae3b].RowInput[0].InputtedData" 
     type="checkbox" 
     value="2" /> 

<input name="sectionRows[a7d91de2-c828-4cd4-979d-783caf85ae3b].RowInput[0].InputtedData" 
     type="hidden" 
     value="false" /> 

<input data-val="true" 
     data-val-number="The field InputtedDataID must be a number." 
     data-val-required="The InputtedDataID field is required." 
     id="sectionRows_a7d91de2-c828-4cd4-979d-783caf85ae3b__RowInput_0__InputtedDataID" 
     name="sectionRows[a7d91de2-c828-4cd4-979d-783caf85ae3b].RowInput[0].InputtedDataID" 
     type="hidden" 
     value="5" /> 

<input data-val="true" 
     data-val-number="The field CtrlTypeID must be a number." 
     data-val-required="The CtrlTypeID field is required." 
     id="sectionRows_a7d91de2-c828-4cd4-979d-783caf85ae3b__RowInput_0__RowCtrl_CtrlTypeID" 
     name="sectionRows[a7d91de2-c828-4cd4-979d-783caf85ae3b].RowInput[0].RowCtrl.CtrlTypeID" 
     type="hidden" 
     value="5" /> 
+0

[正在進行的傳奇....](http://stackoverflow.com/q/11370640/428757) – dotnetN00b 2012-07-09 20:45:59

回答

0
  1. 當多個輸入元件共享相同的name,只有第一個被張貼在所有。
  2. 當複選框未選中時,它們不會發布任何內容。

所以,當你有第一個複選框選中,你會得到「1」。之後的所有內容都被忽略。 當您沒有第一個複選框時,隱藏字段發佈「false」。之後的所有內容都被忽略。

如果您想知道隱藏字段來自何處,MVC助手會創建一個隱藏字段,其名稱與false相同,因爲上面的#2。複選框應該表示布爾值,所以他們總是發佈真/假,而不是值/(沒有)。

+0

那麼如何讓我的第二個複選框發佈「2」? – dotnetN00b 2012-07-09 21:19:23

+0

你不能,只有真/假。或者更具體地說1 /錯誤。它可能被標記爲2,但仍將返回true/false作爲值。 – Carl 2012-07-09 21:47:53

+0

你可以切換到單選按鈕,這聽起來像你想要的,或者你不能使用助手。但請記住,即使沒有隱藏的字段,如果你有他們都檢查只有「1」將張貼。 – bhamlin 2012-07-09 21:56:09