Asp.net mvc 2 将KeyValuePair的列表绑定到复选框

Asp.net mvc 2 将KeyValuePair的列表绑定到复选框,asp.net-mvc-2,binding,Asp.net Mvc 2,Binding,我正在使用ASP.NETMVC和C#。我有一个模型,其中有一个用于筛选条件的成员。此成员是IList>。该键包含要显示的值,该值指示是否选择了此筛选器。我想把它绑定到视图上的一堆复选框中。我就是这样做的 <% for(int i=0;i<Model.customers.filterCriteria.Count;i++) { %> <%=Html.CheckBoxFor(Model.customers.filterCriteria[i].value)%>&nb

我正在使用ASP.NETMVC和C#。我有一个模型,其中有一个用于筛选条件的成员。此成员是IList>。该键包含要显示的值,该值指示是否选择了此筛选器。我想把它绑定到视图上的一堆复选框中。我就是这样做的

<% for(int i=0;i<Model.customers.filterCriteria.Count;i++) { %>
<%=Html.CheckBoxFor(Model.customers.filterCriteria[i].value)%>&nbsp;
<%=Model.customers.filterCriteria[i].key%>
<% } %>

KeyValuePair结构的问题在于它具有私有setter,这意味着默认模型绑定器无法在POST操作中设置其值。它有一个特殊的构造函数,需要使用它来传递键和值,但是默认的模型绑定器当然不知道这个构造函数,并且它使用默认的构造函数,所以除非您为这种类型编写自定义模型绑定器,否则您将无法使用它

我建议您使用自定义类型,而不是
KeyValuePair

因此,我们总是从视图模型开始:

public class Item
{
    public string Name { get; set; }
    public bool Value { get; set; }
}

public class MyViewModel
{
    public IList<Item> FilterCriteria { get; set; }
}
以及相应的
~/Views/Home/Index.aspx
视图:

<% using (Html.BeginForm()) { %>
    <%= Html.EditorFor(x => x.FilterCriteria) %>
    <input type="submit" value="OK" />
<% } %>

我们已经完成了两件事:清理了丑陋的
循环中的视图,并使模型绑定器成功地绑定了POST操作中的复选框值。

我是否遗漏了什么,但奇怪的是,您为每个标准输出了两个复选框?为什么不使用foreach循环呢?最后一个问题,如何在控制器中绑定模型?您是在使用自动模型绑定还是在检查表单集合?@mr.nicksta:我的错误..更正。。。我正在使用@Page指令中的Inherits AttAttribute将视图绑定到控制器。这就是你要问的吗?你要说的是如何强式输入你的视图,而我要说的是控制器上的操作,你能发布代码吗?这将使您了解如何尝试从HTTP RequestThank@Darin中提取值!我会试试这个,让你知道。。。现在+1@Darin.. 在实现了这个之后,我在视图中得到了下面的字符串,而不是复选框。。我试图用谷歌搜索,但找不到线索。。有什么想法吗?AutoInternalCustomerSecurityOutboundSystem@Anil索曼,这是一个强烈的迹象,表明你的编辑器模板没有被拿起。发生这种情况是因为它可能未放置在正确的位置或名称不正确。因此,正如您在我的示例中所看到的,
FilterCriteria
视图模型属性的类型是
IList
,因此编辑器模板是
~/Views/Shared/EditorTemplates/Item.ascx
。您可以将
替换为您正在使用的类型的名称,但您需要遵守此约定才能提取模板。谢谢,另外,使用
词典
发布也可以帮助他人。
<% using (Html.BeginForm()) { %>
    <%= Html.EditorFor(x => x.FilterCriteria) %>
    <input type="submit" value="OK" />
<% } %>
<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<AppName.Models.Item>" 
%>
<%= Html.CheckBoxFor(x => x.Value) %>
<%= Html.HiddenFor(x => x.Name) %>
<%= Html.Encode(Model.Name) %>