【问题标题】:Why is this checkbox[list] returning 1 or false?为什么这个 checkbox[list] 返回 1 或 false?
【发布时间】:2012-07-09 07:24:33
【问题描述】:

当我选中两个复选框时,我得到“1”。当我选中第一个复选框时,我得到“1”。当我只选中第二个复选框时,我得到“假”。这是为什么?而且,我如何让另一个复选框发布它的值(或根本没有)?下面的代码和生成的 HTML。

@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" />

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-3 html-helper


【解决方案1】:
  1. 当多个输入元素共享同一个name 时,只会发布第一个。
  2. 未选中复选框时,它们不会发布任何内容。

因此,当您选中第一个复选框时,您会得到“1”。之后的一切都被忽略。 当您没有第一个复选框时,隐藏字段会发布“false”。之后的所有内容都将被忽略。

如果您想知道隐藏字段的来源,MVC 助手会创建一个具有相同名称和值false 的隐藏字段,因为上面的#2。复选框应该代表布尔值,因此它们希望始终发布 true/false,而不是 value/(nothing)。

【讨论】:

  • 那么我如何让我的第二个复选框发布“2”?
  • 你不能,只有真/假。或者更具体地说是 1/false。它可能被标记为 2,但仍会返回 true/false 作为值。
  • 你可以切换到单选按钮,这听起来像你想要的,或者你不能使用助手。但请记住,即使没有隐藏字段,如果您同时选中它们,也只会发布“1”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
相关资源
最近更新 更多