2009-01-16 24 views
1

J'ai un formulaire qui contient tout un tas de champs de saisie de données qui seront complétés par l'utilisateur, y compris certains éléments où l'utilisateur peut dicter combien des mêmes éléments ils vont entrer. C'est comme cela est utilisé dans l'entrée de blog de Phil Haack Model Binding To A List. J'utilise avec succès JQuery pour créer les éléments de formulaire supplémentaires, correctement indexés, etc. Mon problème est la meilleure façon de les lire dans mon contrôleur. Le contrôleur dans l'article attend seulement un objet, IList<Product> alors que mon contrôleur attend déjà un FormCollection form et maintenant j'essaye aussi de lui envoyer un IList<Itmes>. Dois-je ajouter ceci aux paramètres attendus par le contrôleur ou accéder via le formulaire ["items"] ou quelque chose d'autre?Passer un contrôleur une FormCollection et une IList <T>

Voir

<form action="/MyItems/Add" method="post"> 
    <input type="text" name="Title" value="" /> 

    <input type="hidden" name="myItem.Index" value="0" /> 
    <input id="item[0].Amount" name="item[0].Amount" type="text" value="" /> 
    <input id="item[0].Name" name="item[0].Name" type="text" value="" /> 

    <input type="hidden" name="myItem.Index" value="1" /> 
    <input id="item[1].Amount" name="item[1].Amount" type="text" value="" /> 
    <input id="item[1].Name" name="item[1].Name" type="text" value="" /> 
</form> 

Contrôleur

public ActionResult Add(FormCollection form) 
{ 
    string Title = form["Title"]; 
    List<Item> Items = form["items"].ToList(); 
} 

DTO

public class Item() 
{ 
    int Amount {get; set; }; 
    string Name {get; set; }; 
} 
+0

Scott Hanselman a un [article de blog] (http://stackoverflow.com/questions/449138/passing-controller-a-formcollection-and-an-ilistt/450176#450176) lié à cela. Le blog de [http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx] de Phil Haack est très utile pour poster des listes aussi (comme mentionné dans la question initiale. –

Répondre

1

J'ai décidé de travailler exclusivement avec le FormCollection plutôt que de brouiller les cartes avec des données transmises en utilisant FormCollection et d'autres données mappées à une liste par le framework. Le code ci-dessous prend les articles et hydrate le DTO manuellement. Cela fonctionne bien et me permet de faire d'autres choses dans mon code qui n'étaient pas possible de mapper directement à une liste.

List<Item> itemList = new List<Item>(); 
int i = 0; 

while (form["item[" + i + "].Amount"] != null) 
{ 
    itemList.Add(new Item() 
     { 
      Amount = Convert.ToInt32(form[String.Format("item[{0}].Amount",i)]), 
      Name = form[String.Format("item[{0}].Name",i)] 
     }); 
} 
1

Vous pouvez simplement ajouter le MyItem comme p arameter comme suit:

public ActionResult Add(FormCollection form, List<Item> myItem) 
{ 
} 

Il se liera alors automatiquement à partir des données de formulaire et remplira le paramètre myItem.

+0

Je vais donner un autre coup. J'ai essayé cela mais j'ai continué à obtenir une "Référence d'objet non définie sur une instance d'un objet". erreur donc supposé qu'il ne se lierait pas automatiquement si j'utilisais aussi FormCollection. – dave

+0

C'est parfait! Impossible d'être plus facile :) – zanona

0

Je ne l'ai pas essayé cela, vous devez donc lui donner un aller, mais pourquoi ne pas utiliser la méthode UpdateModel ou TryUpdateModel? Cela devrait se lier de la même manière que le passage de IList dans l'action du contrôleur.

C'est:

public ActionResult Add(FormCollection form) 
{ 
    List<Item> items = new List<Item>(); 
    TryUpdateModel(items, form); 
} 

Je ne suis pas à mon ordinateur de développement, donc je ne suis pas sûr que ça va marcher, mais j'attendre qu'il devrait. Faites-moi savoir si c'est ce dont vous avez besoin.

EDIT: Il vaut la peine de noter que si vous utilisez le framework d'entité, j'ai rencontré de nombreux problèmes avec les méthodes UpdateModel et ai eu recours à l'écriture de mes propres.