2009-01-09 8 views
1

Ok, je suis un débutant MVC venant d'un arrière-plan webforms, alors s'il vous plaît excuser toute ignorance ici. Voici mon scénario. J'ai une table composée d'une liste d'applications et d'autorisations associées. Chaque ligne de table est composée de trois éléments d'information: une case à cocher, du texte décrivant la ligne et une liste déroulante permettant à l'utilisateur de sélectionner l'autorisation appropriée pour l'application. Je veux poster ces données et travailler seulement avec les lignes dans la table qui ont été vérifiées (l'id de la rangée est incorporé comme nom de case à cocher). À partir de là, je veux récupérer la valeur sélectionnée dans DropDownList et appeler le code nécessaire pour mettre à jour la base de données. Voici mon avis le code de la page:Analyse des valeurs de formulaire à partir d'une table dans ASP.NET MVC?

  <%foreach (var app in newApps) 
       { %> 
       <tr> 
        <td><input type="checkbox" name="AddApps" value="<%=app.ApplicationId %>" /></td> 
        <td><%=Html.Encode(app.ApplicationName)%></td> 
        <td><%=Html.DropDownList("AppRole", new SelectList(app.Roles, "RoleId", "RoleDescription"))%></td> 
       </tr> 
       <%} %> 

Comment puis-je récupérer les valeurs appropriées du FormCollection quand je reçois au contrôleur de forme post? Je l'ai fait dans le passé quand j'avais seulement des valeurs de case à cocher à récupérer en appelant simplement Request.Form ["CheckBoxName"] et en analysant la chaîne. Ou est-ce que je vais tout à fait faux?

+0

Jetez un oeil à ce lien http://stackoverflow.com/questions/5088450/simple-mvc3-question-how-to-retreive-form-values-from-httppost-dictionary-or –

Répondre

2

Vous êtes à mi-chemin à droite afin d'afficher vos données que le contrôleur peut lire l'information, il doit être dans une forme comme ceci:

 <% using(Html.BeginForm("Retrieve", "Home")) %>//Retrieve is the name of the action while Home is the name of the controller 
     <% { %> 
      <%foreach (var app in newApps)    { %> 
      <tr> 
       <td><%=Html.CheckBox(""+app.ApplicationId)%></td>  
      <td><%=Html.Encode(app.ApplicationName)%></td> 
       <td><%=Html.DropDownList("AppRole", new SelectList(app.Roles, "RoleId", "RoleDescription"))%></td> 
      </tr> 
     <%} %> 
     <input type"submit"/> 
    <% } %> 

et sur votre contrôleur:

 public ActionResult Retrieve() 
    { 
     //since all variables are dynamically bound you must load your DB into strings in a for loop as so: 
     List<app>=newApps; 
     for(int i=0; i<app.Count;i++) 
     { 


     var checkobx=Request.Form[""+app[i].ApplicationId]; 
     // the reason you check for false because the Html checkbox helper does some kind of freaky thing for value true: it makes the string read "true, false" 
      if(checkbox!="false") 
      { 
      //etc...almost same for other parameters you want that are in thr form 
      } 

     } 
    //of course return your view 
    return View("Index");//this vaires by the name of your view ex: if Index.aspx 
    } 

Cette site donne plus de détails sur la façon de gérer le helper dropdownlist:

http://quickstarts.asp.net/previews/mvc/mvc_HowToRenderFormUsingHtmlHelpers.htm

1

Request.Form fonctionnera toujours, sauf que vos cases à cocher ont tous le même nom.

Ainsi, une manière serait de donner aux cases à cocher des noms distincts, par ex. "AddApps-app.id" et utilisez Request.Form.

Cependant, une méthode plus élégante et testable consiste à utiliser la liaison de liste.

Dans ce modèle, vous donnez à vos éléments de formulaire un certain nom structuré et le classeur de modèle par défaut encapsule chaque ensemble d'éléments de formulaire dans une liste d'enregistrements tapés dans le contrôleur. This is fully explained in this blog post. L'avantage ici est que votre contrôleur ne traite que les instances du type d'application et qu'il n'a donc aucune dépendance implicite sur la façon dont la vue est structurée. Par conséquent, il est très facile de tester un appareil.

Questions connexes