2010-08-07 3 views
3

J'ai deux classes dans mon projet MVC Order et Product.Envoi de la collection d'éléments dans ASP.NET MVC

Parce que Product peut être commandé plusieurs fois et Order peut avoir beaucoup de produits J'ai la troisième entité qui est OrderedProduct. Il relie ces deux entités dans une relation plusieurs-à-plusieurs.

Maintenant, ce que j'essaie de faire est de permettre à l'utilisateur de passer une commande en mettant les produits de la liste déroulante dans la boîte, puis d'enregistrer ma commande. En outre, le client doit remplir certains champs dans l'entité de commande, tels que les données d'adresse, etc. Tout ce que je veux, c'est tout sur une seule page. L'utilisateur peut ajouter autant d'éléments de la liste déroulante qu'il le souhaite, puis il peut ajouter l'ordre entier.

Pour faciliter la visualisation regard sur cette image:

Layout http://img245.imageshack.us/img245/4618/myimage.png

Maintenant, le problème est de savoir comment mettre en œuvre un tel comportement dans mon application MVC. Dois-je créer un ViewModel qui combine la classe Order et la liste Product ou utiliser une vue partielle pour les classes Product?

Aussi, quel est mon problème principal, comment puis-je (de façon élégante) récupérer la liste complète des produits choisis ou au moins des ID de produit dans le contrôleur après la demande POST? Dans ce cas, comment puis-je spécifier que ce que j'envoie est une collection d'identifiants? C'est simple d'ajouter un objet, mais qu'en est-il de la collection entière?

C'est l'endroit où je ne comprends pas vraiment asp.net MVC, alors s'il vous plaît donnez-moi quelques idées brillantes;) Salutations à vous tous, merci de conseils pour toutes vos réponses!

Répondre

2

L'interface souhaitée me semble un peu confuse, mais voici comment vous pouvez gérer ces choses .. modifier à votre goût. Je vais supposer OrderedProduct est un objet à commander qui contient un ID de produit et une quantité et que vous voulez être en mesure de les modifier tous en même temps.

Créez Order votre ViewModel. Étant donné qu'il a une propriété List<OrderedProduct> appelée OrderedProducts:
Créer un petit contrôle d'éditeur avec un ViewModel de OrderedProduct. Aucun formulaire, juste une zone de texte/une liste déroulante/tout ce qui est lié à la propriété du nom de produit et une zone de texte liée à la quantité de produit. Important: placez ce contrôle dans views/shared/EditorTemplates et appelez-le OrderedProduct.ascx.

Donnez à votre objet Order une propriété appelée NewOrderedProduct de type OrderedProduct. Dans le formulaire pour la vue Order faire: <%=Html.EditorFor(m=>m.OrderedProducts)%> cela vous donnera une liste modifiable articles courants dans la commande.
Après cela faire: <%= Html.EditorFor(m=> m.NewOrderedProduct) %> c'est où vous pouvez ajouter de nouveaux éléments.
L'action [POST] prend un type de Order.

Maintenant, quand il soumet si la propriété NewOrderedProduct est valide, vous pouvez l'ajouter à la liste OrderedProducts et la réafficher. Vous pouvez en ajouter autant que vous le souhaitez de cette façon et ils seront tous autobind. Avoir un bouton d'envoi séparé dans le formulaire pour soumettre la commande.Vérifiez l'existence du nom de ce bouton dans [POST] et soumettez tout en même temps.

Ceci vous donne une version de travail HTML. De là, vous pouvez l'Ajaxifier si vous le souhaitez.

Modifier
Mise à jour pour refléter la fonction de l'objet OrderedProduct et corriger le type le poste accepte

+0

Cet exemple est difficile à suivre en quelque sorte. Serait-il possible de voir du code? – Ciel

Questions connexes