Asp.net mvc ASP.NET MVC-模型绑定一组动态生成的复选框-如何
我试图对一组动态生成的复选框进行模型绑定,以便在控制器操作中处理它们,但无法实现模型绑定。这是一个场景: My ViewModel类(DocumentAddEditModel)包含一个字典(dictionary),每个条目的字符串是每个复选框的名称/标签,布尔值指示是否选中该复选框: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
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])
}