Edit View with child entity selection listbox and HTTPPost difficulties

1k Views Asked by At

I have a Search Edit view which is strongly typed to my Search model class seen below (simplified).

Searches and Custodians

I want to display the custodians that are attributed to the Search being edited in a listbox showing all Custodians, with the current ones selected.

My controller's Get Edit action is thus:

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

And my Views listbox is thus:

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

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

This produces a listbox with the Custodians depicted, but none are selected (I have confirmed that several of the SelectListItems accurately describe the custodian as selected. I have tried using ListBoxFor and it produces the same thing when populated with a MultiSelectList.

Finally I decided to just force it to do what I want, but this does not return selected Custodians on Submit.

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

Anyone know how you are supposed to do this?

Edits:

ListBoxFor example

OK so after fiddling around with it for a while longer, I have now gotten Custodians selected in the listbox that correspond to the Search Custodians. Below is the view code:

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

If I select several more custodians, how do I get them (or their corresponding values rather) back to the control upon submit?

1

There are 1 best solutions below

2
On BEST ANSWER

Seeing that after your edit the problem boils down to multiple select model binding, perhaps you will find these useful?

How does a multiple select list work with model binding in ASP.NET MVC?

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