2009-12-10 4 views
2

J'adore MVC mais je ne vois pas comment vous avez l'intention d'implémenter les contrôles utilisateur. Si j'ai plusieurs vues avec les détails du panier, comment puis-je encapsuler la vue et le code du panier afin que je ne doive pas renvoyer les données du panier avec chaque viewdata du contrôleur?Commandes utilisateur dans ASP.NET MVC

Répondre

1

Vous devez renvoyer des données de panier dans chaque action du contrôleur qui renvoie la vue qui utilise le contrôle utilisateur du panier. Mais il existe des méthodes pour éviter la répétition du code ici. Vous pouvez décorer la méthode d'action avec ActionFilterAttribute personnalisé qui injectera les données appropriées dans l'événement OnAxctionExecuted, ou vous pouvez ajouter des données de panier au dictionnaire ViewData dans base controller Initialize method puis y accéder en contrôle avec ViewData ["magic-string"] ou créer méthode d'extension sur HtmlHelper pour éviter les chaînes magiques.

+0

Je ne suggérerais pas de compter beaucoup sur les chaînes magiques. Ils sont pleins de problèmes. Il est préférable de taper fortement, ce qui facilite également la mise en œuvre de la vue partielle. –

+0

Je suis d'accord. C'était juste l'une des nombreuses options. La meilleure solution consiste à créer une classe de modèle de base pour tous les modèles de vue et à y placer les données utilisées par les contrôles utilisateur. Ensuite, après le remplissage des données dans ActionFilterAttribute, vous pouvez transmettre des données spécifiques au contrôle utilisateur dans la vue avec Html.RenderPartial ("MyControl", Model.MyControlModelFromBaseViewModel). – PanJanek

+0

juste pour obtenir une chose claire: si je choisis de transmettre les données du panier dans chaque action du contrôleur, quelle est la meilleure façon de mettre en œuvre cela? Hérite de chaque classe de modèle View à partir d'une base qui stockera les données du panier? Est-ce le cas, il semble être une règle très contraignante, peut-être ViewData est plus approprié pour cela? – kilonet

4

A partir de la page MSDN this:

Une vue partielle permet de définir une vue qui sera rendu dans une vue parent. Les vues partielles sont implémentées en tant que contrôles utilisateur ASP.NET (.ascx).

Ecrivez votre vue de panier dans une vue partielle. Dans une page ViewPage, vous appelez Html.RenderPartial("PartialNameHere") pour le rendre à n'importe quel endroit de la page à partir de laquelle vous l'avez appelé. Comme les vues, vous pouvez avoir des vues partielles fortement typées afin de pouvoir transmettre un modèle de n'importe quel type.

S'il vous plaît noter les points suivants (également à partir du lien MSDN ci-dessus, moi qui souligne):

Lorsqu'une vue partielle est instancié, il obtient son propre copie de l'objet ViewDataDictionary qui est disponible pour le parent vue. La vue partielle a donc accès aux données de la vue parente. Toutefois, si la vue partielle met à jour les données, ces mises à jour affectent uniquement l'objet ViewData de la vue partielle. Les données de la vue parente sont et non modifiée.

2

Les autres réponses sont exactement exactes, mais il existe une deuxième option. Vous pouvez afficher votre vue partielle à la suite d'un appel AJAX à une action de contrôleur dédiée à votre vue partielle. De cette façon, votre vue partielle doit juste faire face à un modèle qui a des données dont il se soucie.

+0

Je suis d'accord que c'est la solution la plus élégante du point de vue de l'architecture du projet. J'ai été tenté à plusieurs reprises pour ce genre de solution, mais le problème standard est "Que faire si l'utilisateur a ajax/js désactivé?" Certaines fonctionnalités de base (comme le panier) seront inaccessibles.Le deuxième inconvénient est qu'obtenir une partie de la page dans une autre requête ajax ralentit le chargement de la page et affecte l'expérience des utilisateurs - la page semble moins sensible. – PanJanek

+0

Eh bien, je suis légèrement d'accord. Si vous avez trop de problèmes (de gros volumes de données en un seul appel ou de nombreux petits appels ajax), cela peut ralentir votre page, mais si vous l'utilisez judicieusement, cela fonctionne très bien. Comme tout dans la vie, utilisez-le avec modération. En ce qui concerne ajax/js désactivé. Honnêtement, je ne m'inquiète pas trop pour ça ces temps-ci. C'était certainement un problème il y a peut-être 5 ans, mais je n'ai pas rencontré de problème avec un client désactivé js. Cela ne veut pas dire que ça n'existe pas, mais ce n'est certainement pas aussi commun qu'autrefois. –

+0

la raison moyenne de ne pas utiliser l'appel ajax est pour seo où le js n'est pas exécuté – monkeylee

Questions connexes