2009-02-05 11 views
5

Le meilleur exemple public que je puisse penser au-dessus de ma tête serait le panier d'achat d'amazon. Où vous avez une page qui affiche plusieurs enregistrements distincts qui peuvent avoir plusieurs champs distincts mis à jour.Quelle est la meilleure façon de gérer les formes répétitives dans MVC?

Je ne peux pas mettre chacun dans une étiquette de formulaire parce que l'utilisateur peut modifier plus d'un enregistrement, puis soumettre.

Je ne peux pas mettre à jour que tous les enregistrements que je reviens parce que: 1. Performance

2. Audit
3. Si quelqu'un a changé le dossier que l'utilisateur « n'a pas changé » quand ils étaient afficher la page, puis l'utilisateur soumet ces modifications seraient remplacées.

Alors, comment gérer au mieux la récupération des données et obtenir les enregistrements qui en ont été modifiés?

Est-ce clair?

Répondre

3

Utilisez la liaison! Ne répétez pas la collection de formulaires dans vos actions. Steve Sanderson a écrit un blog post sur la façon de le faire. J'ai écrit un blog post sur la façon de le faire avec MvcContrib. FluentHtml. Les deux messages sont très détaillés et incluent du code téléchargeable.

1

Générez votre formulaire dans un répéteur et ajoutez un ID aux éléments de formulaire qui s'incrémente à chaque nouveau formulaire. Enregistrez le nombre d'éléments de formulaire répétés dans un champ masqué. Ensuite, dans votre contrôleur, lisez la valeur de ce champ caché - ce sera le nombre de formulaires à lire. Ensuite, dans une boucle, récupérez les champs de chaque formulaire en spécifiant le nom du champ, plus l'index de boucle ajouté au nom, comme clé.

Vous pouvez utiliser une logique javascript pour détecter la modification de la valeur d'un formulaire et mettre à jour un champ masqué dans la section de ce formulaire si cela se produit; ou vous pouvez cacher les valeurs d'origine dans un champ caché avec chaque section de formulaire (bien que je ne recommande pas cela car trop de champs/formulaires vont gonfler votre page).

+0

Je pense que j'aime ça. Le champ caché + mise à jour JS pour dire quand un enregistrement est changé est ce à quoi je n'ai pas pensé. Je pense que je serais même capable d'écrire un classeur modèle pour obtenir une collection en tant que paramètre d'action. –

+0

Un classeur modèle serait un bon moyen d'aller, certainement. :) Tiens nous au courant de comment ça se passe. –

1

un (mais pas nécessairement la meilleure) approche est de stocker les éléments sont changés en-variables js ou quelque chose du côté client car ils sont changés, puis envoyer uniquement les données qui est réellement différent de ce que l'utilisateur a reçu. Comme Erik l'a indiqué, vous pouvez utiliser des éléments de formulaire cachés pour vous assurer que cela fonctionne sans js.

+0

C'est aussi une bonne solution - et si vous incluez le contenu de ma réponse, alors vous avez une solution qui réduit le trafic dans le cas courant, mais se dégrade gracieusement dans le cas rare d'un utilisateur qui n'a pas JS activé . –

Questions connexes