views:

167

answers:

1

I am using incremental sequencing for a collection of objects in a form. All works fine and dandy except when I need to use DropDownListFor. Lots of questions concerning binding a dropdown and selecting the correct value, which is working fine in my case. However I am unclear on what is supposed to have on the HttpPost action in my controller. Here is my code:

Model

public class WorkRequestList
{
    public WorkRequest[] Requests { get; set; }
    public Vehicle[] Vehicles { get; set; }       
}

View

 <% using (Html.BeginForm()) {%>
     <% for (var i = 0; i < Model.Requests.Count(); i++) { %>
        <%=Html.DropDownListFor(x => x.Requests[i].AssignedTo,new SelectList(Model.Vehicles,"Id","Name",Model.Requests[i].AssignedTo.Id)) %>
      <%}%>
 <%=Html.SubmitButton("TopSubmit","Submit") %>
<%}%>

Posted Action

[HttpPost]
public ActionResult Schedule(WorkRequestList form)
{
      //what goes here?
}

The dropdown lists get populated just fine, they get pre-selected just fine. But on post back form.Requests.AssignedTo is null. I'm assuming the Vehicle Id is being posted back somewhere, but how do I get to that without resorting looping through the Request magic strings:

var id = Request["Requests[" + i + "].AssignedTo"];
+1  A: 

Here is an alternate approach, as I could not get sub objects bound either without an explicit modelbinder:

define a new class for your response:

public class WorkRequestResponse 
{
    public int AssignedTo { get; set; }
}

On the page change it as follows: (I changed request to WorkRequest)

<% for (var i = 0; i < Model.WorkRequest.Count(); i++)
       { %>
    <%=Html.DropDownListFor(x => x.WorkRequest[i].AssignedTo, new SelectList(Model.Vehicles, "Id", "Name", Model.WorkRequest[i].AssignedTo.Id))%>
    <%}%>

On your controller bind as follows:

public ActionResult Index([Bind(Prefix = "WorkRequest")]List<WorkRequestResponse> AssignedTo)
{
    // AssignedTo is now populated
    WorkRequestList.WorkRequests = magic_assign_function(AssignedTo); 
    // manual model validation etc....
}

I would be keen to see if there is a more direct route, as this has plagued me too.

AJ
I wrote a gigantic ugly modelbinder that I am using. This looks like a better approach, will try it out.
mxmissile
This is way cool, thanks, just made MVC a lot easier for me.
mxmissile