2010-09-23 17 views
2

J'ai vu plein d'exemples (NerdDinner, Sanderson's Sports Store, etc.) où une vue est liée à une collection d'objets. La syntaxe de la vue est généralement quelque chose comme ça ...ASP.NET MVC - Vue d'insertion ou de mise à jour avec le modèle IEnumerable

<%@ Page... Inherits="System.Web.Mvc.ViewPage<IEnumerable<MyViewModel>>" %> 
... 
<% foreach (var myViewModel in Model) { %> 

J'ai aussi vu beaucoup d'exemples d'inserts ou des mises à jour où le contrôleur se liant automatiquement le paramètre de modèle aux éléments de formulaire dans la vue.

Je cherche un mélange des deux techniques où ma vue a des éléments de forme se rapportant à une collection de myViewModels où chaque myViewModel a 3-4 propriétés. L'intention est de permettre à l'utilisateur d'entrer un ensemble de ces éléments en une seule fois.

En supposant que ce soit possible, quelqu'un peut-il m'aider avec la syntaxe? Je ne peux pas comprendre comment étiqueter les éléments de formulaire pour que la liaison fonctionne.

+0

+1 pour annuler la rétrogradation .. – Ahmad

Répondre

5

Ceci est possible grâce au modèle de liaison intégré , mais vous devez faire un peu de nommage conventionnel de vos objets de formulaire. Tout d'abord, votre action doit prendre une collection:

[HttpPost] 
public ActionResult CreateFoos(List<Foo> foos) 
{ 
    // I have a list of the foo objects that were posted 
} 

Et puis, dans la vue, disons que vous vouliez faire un formulaire pour chaque objet:

<% for (int i = 0; i < Model.Count; i++) { %> 
    <%: Html.TextBoxFor(x => x[i].Property1) %> 
    <%: Html.TextBoxFor(x => x[i].Property2) %> 
    <%: Html.TextBoxFor(x => x[i].Property3) %> 
<% } %> 

attention à la façon dont les contrôles sont rendu dans le HTML, car dans votre vue "créer", vous pouvez avoir un bouton javascript qui permet à l'utilisateur d'ajouter un autre enregistrement, et vous devrez augmenter l'index pour chaque contrôle supplémentaire. Ce n'est pas trop dur, mais je voulais juste vous avertir de prêter attention à la source qu'il génère réellement.