Pergunta

estou usando Sequenciamento incremental para uma coleção de objetos em uma forma. Tudo funciona bem e dândy, exceto quando eu preciso usar o DropDownListfor. Vários perguntas sobre vincular um suspensão e selecionando o valor correto, que está funcionando bem no meu caso. No entanto, não estou claro sobre o que deveria ter na ação HTTPPOST no meu controlador. Aqui está o meu código:

Modelo

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

Visão

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

Ação postada

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

As listas suspensas ficam bem preenchidas, elas são pré-selecionadas muito bem. Mas na postagem form.Requests.AssignedTo é nulo. Estou assumindo que o ID do veículo está sendo postado em algum lugar, mas como faço para chegar a isso sem recorrer ao loop através do Request Strings mágicas:

var id = Request["Requests[" + i + "].AssignedTo"];
Foi útil?

Solução

Aqui está uma abordagem alternativa, pois eu não conseguia limitar os objetos sem um Modelbinder explícito:

Defina uma nova classe para sua resposta:

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

Na página, altere a seguinte

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

No seu controlador se liga da seguinte forma:

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

Eu gostaria de ver se há uma rota mais direta, pois isso também me atormentou.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top