Presentazione corretta dei moduli con controlli generati automaticamente
-
05-07-2019 - |
Domanda
Basato su: MVC Html.CheckBox e modulo invia problema
Consideriamo il seguente esempio. Vista:
<% using(Html.BeginForm("Retrieve", "Home")) %>
<% { %>
<%foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(""+app.ApplicationId )%></td>
</tr>
<%} %>
<input type"submit"/>
<% } %>
Controller:
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
}
La soluzione proposta riguardava l'analisi manuale di Request.Form che mi sembra fuori dal concetto MVC. Risolve il problema durante il test dell'unità di questo metodo del controller. In questo caso, devo generare l'oggetto Request.Form finto anziché alcuni ViewModel passati come parametro di input.
D: Esiste un'altra soluzione per l'invio di moduli come questo, in modo che l'oggetto ViewModel, contenente la raccolta di controlli inviati, sia passato come parametro di input al metodo del controller?
Ad esempio:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist)
o
public ActionResult Retrieve(AppList<App> applist)
etc
Soluzione
Controller:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist)
Visualizza:
<% 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" />
<% } %>
AGGIORNAMENTO:
Se ApplicationId è una chiave del DB, è meglio usare AppList<App>
come parametro Action. Quindi il tuo modulo sarà simile a:
<% 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" />
<% } %>