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