Dans cet article, nous allons voir comment passer une liste d’objet d’une Vue vers le Contrôleur.
Asp.net MVC DefaultModelBinder:
Avec l’utilisation de la DefaultModelBinder dans ASP.NET MVC, vous pouvez lier les valeurs de formulaires soumis dans la Vue à des arguments d'une méthode du Contrôleur.
Mais le problème c’est qu’on ne peut pas lier directement un formulaire posté à une collection d’objet ICollection<T>.
Affichage de l'interface initiale :
Par exemple supposons que vous avez la méthode suivante :
public ActionResult UpdateInts(ICollection<int> ints) {
return View(ints);
}
Vous pouvez lier l’action en soumettant tout simplement un formulaire des champs entiers avec le même nom (ints).
Maintenant prenons l’exemple d’une liste d’objets (Piece)
public class Piece
{
public int Id { get; set; }
public string Niveau { get; set; }
}
Nous allons rajouter une nouvelle vue qui prend comme model une collection des pièces (ICollection<Piece>) et qui contient un formulaire HTML.
Ensuite, pour afficher l'éditeur de chaque élément dans la séquence, ajoutez une nouvelle vue partielle qui prend le model Piece comme paramètre (_CreatePiece.cshtml).
Recevoir les données avec la méthode Post
Pour recevoir les données, ajoutez une nouvelle méthode d'action dans le Contrôleur comme suit :
[HttpPost]
public ActionResult EditPiece(IEnumerable<Piece> pieces)
{
…….
}
Avec l’extension Html.BeginCollectionItem vous pouvez recevoir tous les éléments de la liste sans avoir à faire quoi que ce soit. Ces éléments sont de type IEnumerable.
Comment BeginCollectionItem fonctionne
L’extension BeginCollectionItem va créer un nouveau champ caché qui dans notre cas est appelé pieces.index et qui prend comme valeur un Id unique, et reconstruire l’ensemble des champs du formulaire en rajoutant dans l’id et dans le nom le préfix piéces et l’Id unique du champ caché.
Cela va permettre au model binder MVC de reconstruire la liste des objets (Piece) après la soumission du formulaire.
Exemple :
Pour l’utiliser il suffit d’installer le package BeginCollectionItem en utilisant Nuget package manager de VisualStudio.