Lista suspensa de sequenciamento incremental para ligação?
-
23-09-2019 - |
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"];
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.