2009-06-16 8 views
0

Basé sur: MVC Html.CheckBox and form submit issueprésentation correcte des formulaires avec des contrôles autogénérées

Considérons l'exemple suivant. Vue:

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

Solution proposée était sur l'analyse manuelle de Request.Form qui semble pour moi de conception MVC. Il fait le problème pendant le test unitaire de cette méthode de contrôleur. Dans ce cas, j'ai besoin de générer un objet Request.Form mock au lieu de voir un ViewModel passé en paramètre d'entrée. Q: Existe-t-il une autre solution pour soumettre des formulaires comme celui-ci, afin que l'objet ViewModel, contenant la collection de contrôles soumis, soit transmis comme 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

+0

Andrey, j'ai posté une autre solution. Essayez-le. –

Répondre

0

Controller:

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Retrieve(AppList[] applist) 

Vue:

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

Lire ceci: Scott Hanselman's ComputerZen.com - ASP.NET Wire Format for Model Binding to Arrays, Lists, Collections, Dictionaries

mise à jour:

Si ApplicationId est une clé de DB, il est préférable d'utiliser AppList<App> comme paramètre d'action. Alors votre formulaire ressemblerait à:

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

Il semble que ce dont j'avais besoin, mais pour l'instant je n'y ai pas réussi. 1. J'ai trouvé que si app.ApplicationId n'est pas commandé et qu'il y a des trous. puisque c'est la clé db (exemple 1, 2, 5, 11) applist param arrive au contrôleur comme nul. Si je prends une clé itérée comme <%i++;%> cela fonctionne. 2. Le deuxième problème est qu'il se submerge pour former (bien sûr) tous les objets même si la case n'est pas cochée. L'ajout d'un champ additionnel à un modèle pour indiquer si un tel enregistrement a été choisi ne me semble pas une très bonne idée. –

+0

Oui, j'ai fait de même en ajoutant un compteur; Le deuxième problème a été résolu en déplaçant l'état des cases à cocher dans un paramètre tableau séparé. le contrôleur vérifie si cet état est vrai puis ajoute l'objet du modèle à db. Merci pour la navigation. –

Questions connexes