Список привязки KeyValuePair к флажкам - PullRequest
3 голосов
/ 15 апреля 2011

Я использую ASP.Net MVC с C #.У меня есть модель, которая имеет член для критериев фильтра.Этот участник является IList>.Ключ содержит значение для отображения, и оно указывает, выбран этот фильтр или нет.Я хочу связать это с кучей флажков на мой взгляд.Вот как я это сделал.

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

Это правильно отображает все флажки.Но когда я отправляю свою форму в контроллере, я получаю нулевое значение для критериев фильтра, независимо от того, что я выбираю при просмотре.

Из этой публикации я получил подсказку для создания отдельного свойства.Но как это будет работать для IList ..?Любые предложения, пожалуйста?

1 Ответ

6 голосов
/ 16 апреля 2011

Проблема со структурой 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...