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])
}