Динамический список флажков и привязка к модели
Я пытаюсь создать представление, содержащее список флажков, которые динамически создаются из базы данных, и затем извлекать список выбранных, когда форма отправлена назад.
Моя модель EF содержит класс:
public class ItemIWouldLikeACheckboxFor {
public int Id { get; set; }
public string Description { get; set; }
}
У меня есть модель представления, которая содержит их список:
public class PageViewModel {
// various other properties
public List<ItemIWouldLikeACheckboxFor> checkboxList { get; set; }
}
Мой контроллер получает метод:
public ActionResult Create() {
var viewModel = new PageViewModel();
viewModel.checkboxList = db.ItemIWouldLikeACheckboxFors.ToList();
return View(viewModel);
}
Мой взгляд:
<% using (Html.BeginForm()) { %>
<%-- other stuff here... %>
<% foreach (var item in checkboxList) { %>
<%: Html.CheckBox( <!-- what exactly ?????? -->) %>
<% } %>
<%-- other stuff here...%>
<input type="submit" />
<% } %>
Мой метод отправки почты:
[HttpPost]
public ActionResult Create(PageViewModel viewModel) {
// do stuff with other fields
// I would like to do something like:
foreach (var item in selectedCheckBoxes) {
// do stuff
}
}
Я не могу заставить его работать. Мои основные вопросы смешиваются как комментарии в фрагментах кода, но повторяются:
- Является ли модель моего вида ОК? (мне нужно добавить что-нибудь, чтобы захватить выбранные, а не просто список для отображения?)
- Что именно я должен помещать в представление, чтобы сделать каждый флажок?
- Как мне получить доступ к выбранным флажкам в контроллере после публикации?
Ответы
Ответ 1
Вы видели: http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx?
В основном мы создали собственный элемент управления для отображения HTML как
<label for="Products"> Select Products </label>
<ul class="checkBoxList">
<li>
<input type="hidden" value="0" name="Products.Index">
<input type="checkbox" value="3424" name="Products[0].Id" id="Products0">
<label for="Products0">iPod touch 3rd Generation</label>
</li>
<li>
<input type="hidden" value="1" name="Products.Index">
<input type="checkbox" value="3123" name="Products[1].Id" id="Products1">
<label for="Products1">Creative Zen</label>
</li>
</ul>
</div>
Model Looks Хорошо, мы написали пользовательский помощник, поэтому наши страницы aspx выглядят следующим образом:
<%= Html.DropDownFor(m=>m.products) %>
Если вы следуете за публикацией phil haacks, ваша модель должна автоматически привязываться к вашему контроллеру.
Ответ 2
Также хороший ответ в этом вопросе: Несколько вариантов выбора CheckBoxList: сложность привязки модели
У него есть решение, которое использует настраиваемый шаблон редактора.