2009-05-15 9 views
0

Cette même question a été posée here et une réponse a été donnée qui est réalisable, mais avec la finalisation du framework ASP.Net MVC, je me suis demandé s'il y avait une meilleure solution.ASP.Net MVC - Édition d'une collection - est-ce l'itération d'une collection FormCollection de la meilleure façon?

Si j'ai la structure de classe suivante, comment créer la page d'affichage et, plus important encore, renvoyer les données au contrôleur.

public class Person { 


public int Id {get;set;} 
    public string Name {get;set;} 
    public IList<TelNos> TelNos {get;set;} 
} 

public class TelNos{ 
    public string Type {get;set;} 
    public string Number {get;set;} 
} 

Ma compréhension est que dans la page, je pourrais inclure les éléments suivants (en supposant vue fortement typé):

<% foreach (var telNo in Model.Product.TelNos) 
       {%> 
      <p><label for="telNo.Type">Type of Number</label> 

       <%= Html.TextBox("telNo.Type")%> 
       <%= Html.ValidationMessage("telNo.Type", "*")%> 
      </p> 
<p><label for="telNo.Number">Type of Number</label> 

       <%= Html.TextBox("telNo.Number")%> 
       <%= Html.ValidationMessage("telNo.Number", "*")%> 
      </p> 
      <%} %> 

En supposant que j'ai lancé 2 objets TelNos je puis voir 2 séries de zones de texte dans la vue.

Lorsque cette forme est réaffecté, la suggestion sur le post précédent était de parcourir la FormCollection dans la méthode post:

[AcceptVerbs(HttpVerb.POST)] 
public ActionResult Whatever(FormCollection form) 
{ 
.... 
} 

est cependant maintenant la meilleure approche, ou ont les autres mises à jour de MVC fourni une meilleure solution?

Merci, Richard

Répondre

0

Merci pour votre réponse. Votre réponse m'a donné une idée différente de celle que vous suggérez.

Si j'inclue dans la vue un index à l'objet, le générateur Modèle par défaut prend les valeurs et les affecte aux objets associés.Le code de la vue est le suivant:

<% int i=0; 
foreach (var telNo in Model.Product.TelNos) 
        {%> 
       <p><label for="telNo.Type">Type of Number</label> 

        <%= Html.TextBox("telNo"+i.ToString()+".Type")%> 
        <%= Html.ValidationMessage("telNo"+i.ToString()+".Type", "*")%> 
       </p> 
    <p><label for="telNo.Number">Type of Number</label> 

        <%= Html.TextBox("telNo"+i.ToString()+".Number")%> 
        <%= Html.ValidationMessage("telNo"+i.ToString()+".Number", "*")%> 
       </p> 
       <%i++; 
} %> 

Richard

2

Il n'y a pas eu de mises à jour ou les meilleures pratiques (pour autant que je suis au courant) pour le traitement des formes dynamiques sur le poteau. Les méthodes toujours essayées et vraies consistent soit à cataloguer vos informations, soit à parcourir celles-ci dans FormCollection. Si vous regardez here cela pourrait vous aider avec la liaison de données. OU dans ce dernier cas, vous pouvez parcourir la collection de formulaires en appelant les différentes valeurs avec leur nom de chaîne. Bien que cela pourrait avoir des conflits, car ils vont tous avoir le même identifiant de

"telNo.Type" 
"telNo.Number" 

Vous pourriez avoir à faire quelques manipulations pour avoir ce soit quelque chose comme

"telNo.Type[i]" 
"telNo.Number[i]" 

où i est un nombre en séquence pour cet objet dans la liste. Vous pouvez également avoir une combinaison de chaînes qui génère un identifiant unique pour cet objet afin que vous puissiez obtenir le type et le numéro.

"object[i].telNo.Type" 
"object[i].telNo.Number" 

Cela dépend vraiment de la façon dont vous pensez que vous pouvez le mieux l'implémenter. Parfois, obtenir la liaison de données pour travailler sur des formulaires dynamiques peut être pénible et il est plus facile de simplement parcourir la collection, puis d'utiliser quelque chose comme LINQ pour obtenir ceux que vous voulez/les regrouper/etc.

0

J'aime l'idée à ASP.NET MVC Partial View with Form qui des liens tour à Model Binding To A List

Je pense qu'il vaut mieux pour deux raisons:

  1. Going à travers FormCollection viole l'idée de séparer le contrôleur de forme de vue. Le contrôleur aura trop de connaissances sur la façon dont les données sont affichées.
  2. L'écriture d'un test unitaire sera douloureuse. vous devrez coller manuellement toutes les valeurs dans le contrôleur de formulaire
Questions connexes