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
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.
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.
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.
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
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. –
la raison moyenne de ne pas utiliser l'appel ajax est pour seo où le js n'est pas exécuté – monkeylee
- 1. Commandes utilisateur jQuery + MVC
- 2. Commandes serveur dans ASP.NET MVC
- 3. Commandes non actualisées dans ASP.net MVC
- 4. Contrôles utilisateur ASP.NET MVC
- 5. ASP.NET MVC Beta 1 - Mes commandes utilisateur existantes fonctionnent-elles dans mes vues telles quelles?
- 6. Commandes utilisateur dans masterpage et utilisateur anonyme
- 7. Session utilisateur dans l'application ASP.Net MVC
- 8. asp.net mvc journalisés courant dans l'ID utilisateur
- 9. Utilisateur personnalisé dans ASP.NET MVC 2
- 10. Contrôles utilisateur MVC dans ASP.Net standard
- 11. asp.net mvc utilisateur authentification/permission
- 12. problème contrôle utilisateur asp.net mvc
- 13. Rôles utilisateur personnalisés ASP.NET MVC
- 14. contrôles utilisateur et asp.net mvc
- 15. Commandes littérales avec MVC?
- 16. Commandes utilisateur et Viewstate
- 17. Modèle d'interface utilisateur ASP.NET MVC DropDownList
- 18. Modèles d'interface utilisateur pour ASP.NET MVC
- 19. asp.net mvc stocker les données utilisateur
- 20. ASP.NET MVC, Contrôle utilisateur individuel du cache
- 21. ASP.NET MVC n'autorisant qu'un utilisateur connecté
- 22. autorisations utilisateur asp.net mvc et vues
- 23. asp.net mvc 2: utilisateur en ligne
- 24. NHibernate + ASP.Net Flux d'activité utilisateur MVC +
- 25. Choix dynamique d'un contrôle utilisateur Asp.Net MVC
- 26. Comment expirer un utilisateur ASP.NET MVC connecté?
- 27. ASP.NET MVC - Accès utilisateur pour le répertoire
- 28. asp.net problème contrôle utilisateur mvc boucle foreach
- 29. commandes pour ui asp.net
- 30. Commandes Sharepoint dans l'application ASP.NET
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. –
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
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