ASP.NET MVC - привязка модели к набору динамически генерируемых флажков - как

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

В моем классе ViewModel (DocumentAddEditModel) содержится словарь (Dictionary < string, bool > ), причем строка каждой записи является именем/меткой для каждого флажка, а логическое значение указывает, установлен ли флажок:

    public class DocumentAddEditModel
    {
        ...
        private Dictionary<string, bool> _categoryCheckboxes = new Dictionary<string,bool>();
        ...

        ...
        public Dictionary<string, bool> CategoryCheckboxes
        {
            get { return _categoryCheckboxes; }
            set { _categoryCheckboxes = value; }
        }
        ...
    }
}

В моем контроллере действие, которое обрабатывает запрос GET для формы, заполняет запрос следующим образом:

public class DocumentsController : Controller
{
    [RequiresAuthentication]
    [AcceptVerbs(HttpVerbs.Get)]
    public ActionResult Add()
    {
        DocumentAddEditModel documentAddEditModel = new DocumentAddEditModel();
        ...
        Dictionary<string, bool> categoryCheckboxes = new Dictionary<string, bool>();
        ...
        string[] categories = Enum.GetNames(typeof(Category));

        foreach (string category in categories)
            categoryCheckboxes.Add(category, false);

        documentAddEditModel.CategoryCheckboxes = categoryCheckboxes;

        return View(documentAddEditModel);
    }
}

Внутри представления у меня есть следующее, чтобы сгенерировать флажки:

<% foreach (KeyValuePair<string, bool> categoryCheckbox in ViewData.Model.CategoryCheckboxes)
    {%>
    <input class="checkbox" type="checkbox" name="CategoryCheckboxes[0].Key" id="<%= categoryCheckbox.Key %>" />
    <label class="categoryLabel" for="<%= categoryCheckbox.Key %>"><%= categoryCheckbox.Key %></label>
<% } %>

но я думаю, что в этом проблема должна быть. Не уверен, что должно происходить в атрибуте name. Проблема заключается в том, что однажды отправленный обратно в следующий метод действий в DocumentController:

[RequiresAuthentication]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Add(DocumentAddEditModel documentAddEditModel)
{
    ...
}

documentAddEdit.Model.CategoryCheckboxes всегда имеет значение null. Как настроить это так, чтобы словарь CategoryCheckboxes был правильно заполнен именем и отмеченным/непроверенным значением bool для флажков?

Спасибо

Ответы

Ответ 1

Если вы привязываете свои флажки к Dictionary<string, bool>, попробуйте это:

<% var i = 0; %>
<% foreach (KeyValuePair<string, bool> categoryCheckbox in Model.CategoryCheckboxes) {%>

    <input type="hidden" name="<%= String.Format("CategoryCheckboxes[{0}].Key", i) %>" value="<%= categoryCheckbox.Key %>" />
    <%= Html.CheckBox(String.Format("CategoryCheckboxes[{0}].Value", i), categoryCheckbox.Value) %>

    <label class="categoryLabel" for="<%= categoryCheckbox.Key %>"><%= categoryCheckbox.Key %></label>

    <% i++; %>
<% } %>

Надеюсь, что это поможет

ОБНОВЛЕНО:

Для привязки к IDictionary<T1, T2> ваша форма должна содержать входы с "CategoryCheckboxes [n].Key" и "CategoryCheckboxes [n].Value" Идентификаторы/имена ", где n должно быть на основе нуля и не разбито.

Ответ 2

скрытые элементы - это modus operandi asp.net. в версии webforms это было ViewState, которое было массивным скрытым полем, в MVC его более легкий вес более простых скрытых полей для каждого элемента управления. Я не уверен, что это неправильно или беспокоит. Как-то вам нужно сохранить состояние, вы можете сделать это на стороне клиента или на стороне сервера. Я предлагаю клиентскую сторону для нечувствительной информации таким образом, что она все равно будет присутствовать, если сервер перезагрузится между postbacks и т.д.

Ответ 3

Что-то проще:

@foreach (var pair in Model.CategoryCheckboxes)
{
    @Html.CheckBoxFor(m=>m.CategoryCheckboxes[pair.Key])
}