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

Était-ce utile?

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

Lisez ceci: ComputerZen.com de Scott Hanselman - Format de fil pour la mise en relation avec Arrays , Listes, collections, dictionnaires

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" />
<% } %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top