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

È stato utile?

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

Leggi: Scott Wire di ComputerZen.com di Scott Hanselman - ASP.NET Wire Wire for Model Binding to Arrays , Liste, raccolte, dizionari

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" />
<% } %>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top