Formcollection содержит только выбранные значения элементов html.listbox? MVC
Мой сценарий таков: у меня есть два списка, один из которых содержит все мои элементы базы данных, и пустой. Пользователь добавляет элементы, необходимые из полного списка, в пустой список.
Я использую форму для отправки всех элементов, добавленных пользователем.
Проблема заключается в том, что представлены только выбранные элементы из списка. Поэтому, если пользователь отменяет выбор некоторых элементов, они не будут представлены в форме. Мой вид выглядит так:
<% using (Html.BeginForm("MyAction", "MyController"))
{ %>
<%= Html.ListBox("AddedItems", Model.Items)%>
<input type="submit" value="Submit" name="SubmitButton"/>
<% } %>
Мой контроллер выглядит так:
public ActionResult MyAction(FormCollection formCollection)
{
var addedItems = formCollection["AddedItems"].Split(',');
//....more code that does stuff with the items
}
Я обо всем поменяю? Есть ли лучший способ представить предметы? Что бы вы сделали?
Ответы
Ответ 1
Я тоже это делаю, я думаю, что я решил, что это немного более элегантно. По сути, у меня просто есть функция Jquery, которая запускается до сообщения формы, которое выбирает все параметры.
$(function () {
$("form").submit(function (e) {
$("#box2View option").attr("selected", "selected");
});
});
Ответ 2
Потому что это просто selectbox. Вы не можете публиковать все значения в selectbox. Вы должны использовать javascript, чтобы поймать добавленные элементы и сохранить их в скрытом вводе.
Не проверенный код, но я думаю, что он вам поможет.
<script type="text/javascript">
function addItem() {
var allItems = document.getElementById("AllItems");
var op = allItems.options[allItems.selectedIndex];
var hdSelectedItems = document.getElementById("hdSelectedItems");
var lbSelectedItems = document.getElementById("lbSelectedItems");
lbSelectedItems.options[lbSelectedItems.options.length] = op;
if (hdSelectedItems.value != '') {
hdSelectedItems.value += ","
}
hdSelectedItems.value += op.value;
}
</script>
<%= Html.Hidden("hdSelectedItems") %>
<%= Html.ListBox("AllItems", Model.Items)%>
<%= Html.ListBox("lbSelectedItems") %>
<a href="#" onclick="addItem(); return false;">Add</a>
Ответ 3
Почему бы не иметь список элементов в ячейках.
Затем вы можете выполнить итерацию с помощью флажков в своем действии и захватить все выбранные флажки.
<% foreach(var item in Model.Items) { %>
<%= Html.CheckBox(String.Format("ItemID.{0}", item.ID)) %> // each item tagged by the items id
<% } %>
public ActionResult MyAction(FormCollection formCollection)
{
foreach (var key in collection.AllKeys.Where(k => !k.Contains("SubmitButton")).ToArray<string>())
{
// iterates thru check boxes we got rid of the button
}
}