Редактировать представление со списком выбора дочерних объектов и сложностями HTTPPost - PullRequest
1 голос
/ 16 ноября 2011

Добрый день, все

У меня есть представление Search Edit, которое строго типизировано для моего класса модели поиска, показанного ниже (упрощенно). Searches and Custodians

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

Действие Get Edit моего контроллера выглядит так:

public ActionResult Edit(int id, int searchListId = 0)
{
    if (searchListId != 0)
    {
        Session["CurrentSearchListID"] = searchListId;  
    }
    ProjectContext mydb = db;
    Search search = Search.Find(mydb, id);

    IEnumerable<SelectListItem> selectedItems =
        from c in Custodian.List(mydb)
        select new SelectListItem
        {
            Selected = (search.Custodians.Contains(c)),
            Text = c.CustodianName,
            Value = c.ToString()
        };

    ViewBag.Custodians = selectedItems;
    return View(search);
}

И мой список просмотров выглядит так:

        @{
            //List<Kiersted.Keps.BusinessObjects.Custodian> Custodians = ViewBag.Custodians;
            IEnumerable<SelectListItem> SelectedItems = ViewBag.Custodians;
        }

        @Html.ListBox("Custodians", SelectedItems);

Это создает список с изображением Хранителей, но ни один из них не выбран (я подтвердил, что некоторые из SelectListItems точно описывают хранителя как выбранного. Я попытался использовать ListBoxFor, и он производит то же самое, когда заполняется MultiSelectList.

Наконец, я решил просто заставить его делать то, что я хочу, но это не возвращает выбранных Хранителей при Подтверждении.

<select id="Custodians" multiple="multiple" name="Custodians">
@foreach (Kiersted.Keps.BusinessObjects.Custodian cust in Custodians)
{
    if (Model.Custodians.Contains(cust))
    {
    <option value="@cust.CustodianID" selected="selected">@cust.CustodianName</option>
    }
    else
    {
    <option value="@cust.CustodianID" >@cust.CustodianName</option>
    }
}
</select>

Кто-нибудь знает, как вы должны сделать это?

Редактирование:

ListBox Например

ОК, так что, немного покопавшись, я теперь выбрал Хранителей, выбранных в списке, которые соответствуют Поисковым Хранителям. Ниже приведен код вида:

<div class="editor-field">
    @Html.ListBoxFor(model => model.Custodians, allCustodians.Select(cust => new SelectListItem {
                           Text = cust.CustodianName,
                           Value = cust.CustodianID.ToString(),
                           Selected = true}), 
                           new { Multiple = "multiple" })
</div>

Если я выберу еще нескольких хранителей, как мне вернуть их (или, скорее, их соответствующие значения) обратно в элемент управления после отправки?

1 Ответ

2 голосов
/ 20 ноября 2011

Видя, что после вашего редактирования проблема сводится к привязке нескольких моделей выбора, возможно, вы найдете это полезным?

Как список с множественным выбором работает с привязкой модели в ASP.NET MVC?

http://ittecture.wordpress.com/2009/04/30/tip-of-the-day-198-asp-net-mvc-listbox-controls/

...