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