2012-07-09 107 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