Asp.net mvc ASP.NET MVC-模型绑定一组动态生成的复选框-如何

Asp.net mvc ASP.NET MVC-模型绑定一组动态生成的复选框-如何,asp.net-mvc,model-view-controller,Asp.net Mvc,Model View Controller,我试图对一组动态生成的复选框进行模型绑定,以便在控制器操作中处理它们,但无法实现模型绑定。这是一个场景: My ViewModel类(DocumentAddEditModel)包含一个字典(dictionary),每个条目的字符串是每个复选框的名称/标签,布尔值指示是否选中该复选框: public class DocumentAddEditModel { ... private Dictionary<string, bool> _cat

我试图对一组动态生成的复选框进行模型绑定,以便在控制器操作中处理它们,但无法实现模型绑定。这是一个场景:

My ViewModel类(DocumentAddEditModel)包含一个字典(dictionary),每个条目的字符串是每个复选框的名称/标签,布尔值指示是否选中该复选框:

    public class DocumentAddEditModel
    {
        ...
        private Dictionary<string, bool> _categoryCheckboxes = new Dictionary<string,bool>();
        ...

        ...
        public Dictionary<string, bool> CategoryCheckboxes
        {
            get { return _categoryCheckboxes; }
            set { _categoryCheckboxes = value; }
        }
        ...
    }
}
documentAddEdit.Model.CategoryCheckBox始终为空。如何设置此选项,以使CategoryCheckBox字典正确填充复选框的名称和选中/未选中的布尔值


如果您要将复选框绑定到
词典

,请尝试以下操作:

<% var i = 0; %>
<% foreach (KeyValuePair<string, bool> categoryCheckbox in Model.CategoryCheckboxes) {%>

    <input type="hidden" name="<%= String.Format("CategoryCheckboxes[{0}].Key", i) %>" value="<%= categoryCheckbox.Key %>" />
    <%= Html.CheckBox(String.Format("CategoryCheckboxes[{0}].Value", i), categoryCheckbox.Value) %>

    <label class="categoryLabel" for="<%= categoryCheckbox.Key %>"><%= categoryCheckbox.Key %></label>

    <% i++; %>
<% } %>

希望这有帮助

更新:


要绑定到
IDictionary
,表单必须包含带有“CategoryCheckBox[n].Key”和“CategoryCheckBox[n].Value”ID/名称的输入,其中n必须是零基且不间断的。

隐藏元素是asp.net的操作方式。在webforms版本中,是ViewState,它是一个巨大的隐藏字段,而在MVC中,它的重量更轻,每个控件的隐藏字段更简单。我不确定这到底是怎么回事或是让人不安。不知何故,您必须保持状态,您可以在客户端或服务器端执行。我建议客户端使用非敏感信息,这样,如果在回发之间重新启动服务器,该信息仍将存在。

更简单的方法:

@foreach (var pair in Model.CategoryCheckboxes)
{
    @Html.CheckBoxFor(m=>m.CategoryCheckboxes[pair.Key])
}

谢谢你,这似乎起到了作用,不过,你能澄清一下这里发生了什么吗?我明白,由于checkbox控件(我再次意识到Html.checkbox()htmlhelper生成第二个隐藏字段,其名称属性等于visible复选框的名称属性,但当我将生成的html与未选中时的复选框进行比较时:article与选中时的内容:article唯一的区别是,在选中状态下,“checked”属性设置为“checked”。保存实际数据的“值”属性不会更改。此外,如果不再次使用隐藏元素(即不使用Html.Checkbox()帮助程序),是否不可能实现我想要的内容?谢谢
[RequiresAuthentication]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(DocumentAddEditModel documentAddEditModel)
{
    ...
}
<% var i = 0; %>
<% foreach (KeyValuePair<string, bool> categoryCheckbox in Model.CategoryCheckboxes) {%>

    <input type="hidden" name="<%= String.Format("CategoryCheckboxes[{0}].Key", i) %>" value="<%= categoryCheckbox.Key %>" />
    <%= Html.CheckBox(String.Format("CategoryCheckboxes[{0}].Value", i), categoryCheckbox.Value) %>

    <label class="categoryLabel" for="<%= categoryCheckbox.Key %>"><%= categoryCheckbox.Key %></label>

    <% i++; %>
<% } %>
@foreach (var pair in Model.CategoryCheckboxes)
{
    @Html.CheckBoxFor(m=>m.CategoryCheckboxes[pair.Key])
}