Проблема со структурой KeyValuePair<TKey, TValue>
состоит в том, что она имеет частные установщики, что означает, что механизм связывания модели по умолчанию не может устанавливать свои значения в действии 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.