ASP.NET MVC - модель связывания набора динамически генерируемых флажков - как - PullRequest
11 голосов
/ 23 июня 2009

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

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

    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>
<% } %>

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

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

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

Спасибо

Ответы [ 3 ]

10 голосов
/ 23 июня 2009

Если вы привязываете свои флажки к 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 должно начинаться с нуля и не прерываться.

1 голос
/ 08 августа 2009

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

0 голосов
/ 15 февраля 2016

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

@foreach (var pair in Model.CategoryCheckboxes)
{
    @Html.CheckBoxFor(m=>m.CategoryCheckboxes[pair.Key])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...