Soumission correcte des formulaires avec des contrôles générés automatiquement
-
05-07-2019 - |
Question
Basé sur: MVC Html.CheckBox et problème d'envoi de formulaire
Considérons l'exemple suivant. Voir:
<% using(Html.BeginForm("Retrieve", "Home")) %>
<% { %>
<%foreach (var app in newApps) { %>
<tr>
<td><%=Html.CheckBox(""+app.ApplicationId )%></td>
</tr>
<%} %>
<input type"submit"/>
<% } %>
Contrôleur:
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 solution proposée concernait l’analyse manuelle de Request.Form qui me paraissait sortir du concept MVC. Cela pose le problème lors du test unitaire de cette méthode de contrôleur. Dans ce cas, je dois générer un objet Request.Form mock au lieu d'un ViewModel transmis en tant que paramètre d'entrée.
Q: Existe-t-il une autre solution de soumission de formulaires de ce type, afin que l'objet ViewModel, contenant la collection de contrôles soumis, soit transmis en tant que paramètre d'entrée à la méthode du contrôleur?
Par exemple:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist)
ou
public ActionResult Retrieve(AppList<App> applist)
etc
La solution
Contrôleur:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Retrieve(AppList[] applist)
Voir:
<% 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" />
<% } %>
MISE À JOUR:
Si ApplicationId est une clé de DB, il est préférable d'utiliser AppList<App>
comme paramètre Action. Ensuite, votre formulaire se présentera comme:
<% 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" />
<% } %>