formcollection содержит только выбранные значения элементов html.listbox? MVC - PullRequest
13 голосов
/ 05 марта 2010

Мой сценарий таков: у меня есть два списка, один из которых содержит все элементы моей базы данных, и пустой.Пользователь добавляет необходимые элементы из полного списка в пустой список.

Я использую форму для отправки всех элементов, добавленных пользователем.

Проблема в том, что только выбранныеэлементы из списка представлены.Поэтому, если пользователь отменяет выбор некоторых элементов, они не будут представлены в форме.Мой взгляд выглядит так:

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

Я все делаю неправильно?Есть ли лучший способ представить предметы?Что бы вы сделали?

Ответы [ 3 ]

23 голосов
/ 19 сентября 2010

Я тоже этим занимаюсь, думаю, способ, которым я это решил, немного более элегантен. По сути, у меня просто есть функция Jquery, которая запускается перед публикацией формы, которая выбирает все параметры.

    $(function () {
        $("form").submit(function (e) {
            $("#box2View option").attr("selected", "selected");
        });
    });
2 голосов
/ 05 марта 2010

Потому что это просто 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>
1 голос
/ 05 марта 2010

Почему бы не иметь список элементов в флажках. Затем вы можете перебрать флажки в вашем действии и захватить все выбранные флажки.

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

            }
}
...