2011-04-15 89 views
3

我正在使用ASP.Net MVC和C#。我有一个模型,它有一个过滤条件的成员。这个成员是IList>。该键包含要显示的值,并且该值指示是否选择此过滤器。我想将它绑定到我的视图上的一堆复选框。这是我做到的。将KeyValuePair绑定到复选框

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

这会正确显示所有复选框。但是,当我提交表单时,在控制器中,无论我选择什么视图,我都会为筛选标准获取null。

this我有一个提示创建单独的属性。但是,这对IList工作..?有什么建议吗?

+0

我错过了什么,但它让我觉得奇怪,你输出两个复选框为每个标准?为什么不使用foreach循环? 最后一个问题,你如何在控制器中绑定你的模型?你在使用自动模型绑定还是在检查表单集合? – WickyNilliams 2011-04-15 12:02:02

+0

@ mr.nicksta:我的错误..更正... 我通过在@Page指令中使用Inherits atttribute将我的视图绑定到控制器。这是你问的吗? – 2011-04-15 12:05:24

+0

你在说什么是如何强烈地键入你的看法,而我说的是在控制器上的行动,你可以发布代码吗?这将让你了解你是如何试图从HTTP请求中获取价值的 – WickyNilliams 2011-04-15 12:23:18

回答

6

KeyValuePair<TKey, TValue>结构的问题是它具有私有setter意味着默认模型联编程序无法在POST操作中设置它们的值。它有一个特殊的构造函数,需要用来传递键和值,当然默认的模型绑定器不知道这个构造函数,它使用默认的构造函数,所以除非你为这种类型写了一个自定义模型绑定器,将无法使用它。

我会建议你使用自定义类型而不是KeyValuePair<TKey, TValue>

,以便始终我们先从视图模型:

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

public class MyViewModel 
{ 
    public IList<Item> FilterCriteria { get; set; } 
} 

然后控制器:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(new MyViewModel 
     { 
      FilterCriteria = new[] 
      { 
       new Item { Name = "Criteria 1", Value = true }, 
       new Item { Name = "Criteria 2", Value = false }, 
       new Item { Name = "Criteria 3", Value = true }, 
      } 
     }); 
    } 

    [HttpPost] 
    public ActionResult Index(MyViewModel model) 
    { 
     // The model will be correctly bound here 
     return View(model); 
    } 
} 

和相应的~/Views/Home/Index.aspx观点:

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

,最后我们写项目类型的定制编辑器模板~/Views/Shared/EditorTemplates/Item.ascx~/Views/Home/EditorTemplates/Item.ascx(如果这个模板是只有特定的家庭控制器,而不是重复使用):

<%@ 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) %> 

我们已经取得了两件事情:清理从丑陋for循环的看法和提出的模型绑定绑定成功的复选框值POST操作。

+0

谢谢@Darin!我会尝试这个,让你知道...现在+1 – 2011-04-17 08:27:08

+0

@达林..实施这个后,我得到了我的看法下面的字符串,而不是复选框..我试图谷歌,但不能得到线索..任何想法? AutoInternalCustomerSecurityOutboundSystem – 2011-04-18 05:37:26

+0

@Anil Soman,这是一个强烈的迹象表明你的编辑器模板没有被拾取。发生这种情况是因为它可能没有放置在正确的位置或具有正确的名称。所以你可以在我的例子中看到'FilterCriteria'视图模型属性的类型是'IList ',所以编辑器模板是'〜/ Views/Shared/EditorTemplates/Item.ascx'。您可以使用您正在使用的类型的名称来替换“Item”,但是您需要遵守此约定来获取模板。 – 2011-04-18 05:44:07