Question

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 permettant à l'utilisateur de dicter le nombre d'éléments identiques qu'il va saisir. Ceci est comme il est utilisé dans l'entrée de blog de Phil Haack Modèle de liaison à une liste .

J'utilise avec succès JQuery pour créer les éléments de formulaire supplémentaires, correctement indexés, etc. Mon problème est le meilleur moyen de les lire dans mon contrôleur. Le contrôleur de l'article n'attend qu'un objet, IList < Produit > alors que mon contrôleur attend déjà un FormCollection form et j'essaie maintenant de lui envoyer également un IList < ; Itmes > également.

Devrais-je ajouter ceci aux paramètres attendus par le contrôleur ou y accéder via le formulaire ["articles"] ou autre chose?

Afficher

<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; };
}
Était-ce utile?

La solution 2

J'ai décidé de travailler exclusivement avec FormCollection plutôt que de brouiller les pistes avec le transfert de certaines données à l'aide de FormCollection et d'autres données mappées sur une liste par cadre. 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 possibles pour mapper directement vers 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 )]
        });
}

Autres conseils

Vous pouvez simplement ajouter le myItem en tant que paramètre comme suit:

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

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

Je n'ai pas essayé cela, vous devrez donc essayer, mais pourquoi ne pas utiliser la méthode UpdateModel ou TryUpdateModel? Cela devrait être lié de la même manière que de passer l'IList à l'action du contrôleur.

C'est-à-dire:

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 je suppose que ça devrait. Faites-moi savoir si c'est ce dont vous avez besoin.

EDIT: Il est intéressant de noter que si vous utilisez le framework d’entités, j’ai rencontré de nombreux problèmes avec les méthodes UpdateModel et j’ai eu recours à l’écriture personnelle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top