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操作。
我错过了什么,但它让我觉得奇怪,你输出两个复选框为每个标准?为什么不使用foreach循环? 最后一个问题,你如何在控制器中绑定你的模型?你在使用自动模型绑定还是在检查表单集合? – WickyNilliams 2011-04-15 12:02:02
@ mr.nicksta:我的错误..更正... 我通过在@Page指令中使用Inherits atttribute将我的视图绑定到控制器。这是你问的吗? – 2011-04-15 12:05:24
你在说什么是如何强烈地键入你的看法,而我说的是在控制器上的行动,你可以发布代码吗?这将让你了解你是如何试图从HTTP请求中获取价值的 – WickyNilliams 2011-04-15 12:23:18