a correcta apresentação dos formulários com controles Autogenerated
-
05-07-2019 - |
Pergunta
Com base em: MVC Html.Checkbox e forma de submissão
Vamos considerar seguinte exemplo. Ver:
<% using(Html.BeginForm("Retrieve", "Home")) %>
<% { %>
<%foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(""+app.ApplicationId )%></td>
</tr>
<%} %>
<input type"submit"/>
<% } %>
Controlador:
List<app>=newApps; //Database bind
for(int i=0; i<app.Count;i++)
{
var checkbox=Request.Form[""+app[i].ApplicationId];
if(checkbox!="false")// if not false then true,false is returned
}
Solução proposta estava prestes a análise manual dos Request.Form que parece para mim fora do conceito da MVC. Ele faz com que o problema, enquanto a unidade de teste de este método de tratamento. Neste caso, eu preciso gerar falsa objeto Request.Form em vez de algum ViewModel passado como parâmetro de entrada.
Q:? Existe alguma outra solução de envio de formulários como este, de modo que ViewModel objeto, contendo coleção de controles submetidos, passados ??como parâmetro de entrada para o método controlador
Por exemplo:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist)
ou
public ActionResult Retrieve(AppList<App> applist)
etc
Solução
Controlador:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist)
Ver:
<% using(Html.BeginForm("Retrieve", "Home")) %> { %>
<%foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(String.Format("appList[{0}].AProperty", app.ApplicationId) %></td>
</tr>
<% } %>
<input type"submit" />
<% } %>
ATUALIZADO:
Se ApplicationId é uma chave do DB é melhor uso AppList<App>
como parâmetro de ação. Em seguida, seu formulário estaria olhando como:
<% using(Html.BeginForm("Retrieve", "Home")) %> { %>
<% var counter = 0; %>
<% foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(String.Format("appList[{0}].Key", counter), app.ApplicationId) %></td>
<!-- ... -->
<td><%=Html.Input(String.Format("appList[{0}].Value.SomeProperty1", counter), app.SomeProperty1) %></td>
<td><%=Html.Input(String.Format("appList[{0}].Value.SomePropertyN", counter), app.SomePropertyN) %></td>
<% counter = counter + 1; %>
</tr>
<% } %>
<input type"submit" />
<% } %>