2009-11-11 7 views
5

Dans notre application Asp.net MVC actuelle, nous avons deux systèmes de menu, un en haut et un sur le côté gauche. Maintenant, nous avons une vue partielle qui rend le menu, mais est-ce la seule façon pour que cela fonctionne aussi pour retourner les éléments de menu avec chaque ViewModel unique? Nous essayons de ne pas utiliser le dictionnaire ViewData.Système de menus dynamique Asp.net MVC

Je pense que la réponse à cette question est oui, mais je veux voir ce que les autres pensent

Répondre

3

3 Options:

  1. RenderAction tout le chemin.

  2. RenderPartial comme Ryan a répondu.

  3. Un MasterViewModel abstrait par exemple. Tous vos modèles sortiraient de cela. Peuplé par un filtre d'action.

3

Vous pouvez utiliser l'action Render de la bibliothèque MVC Future's si vous voulez avoir votre propre contrôleur, etc. pour vos menus à part d'utiliser le modèle de vue principale.

+1

Je crois que vous faites allusion à RenderAction pas renderPartial de l'ensemble à terme. –

+0

Vous avez raison, merci - J'ai modifié l'affichage. :) –

1

Vous avez essentiellement deux options:

  1. Utilisez le ViewModel pour mettre en place des éléments de menu pour afficher, ils seront accessibles de toute vue, complète ou partielle.

  2. Créez une hiérarchie de modèles fortement typés, placez des éléments de menu quelque part dans le modèle de base, ils seront alors présents dans chaque modèle dérivé.

Ce qui vous intéresse, ce sont les contrôleurs asynchrones ou les requêtes partielles. Il n'est pas implémenté dans ASP.NET MVC, mais vous pouvez vérifier le projet de communauté MVC Contrib, il a un certain support avec lui.

+0

La bibliothèque MVC Contrib est bonne, mais il peut être plus facile juste utiliser la bibliothèque de MVC avenir de Microsoft si tout ce qui est nécessaire est la capacité à rendre partials. –

0

Il y a beaucoup d'options pour gérer cela, mais il y a un moyen très simple que nous avons trouvé pour gérer cela qui ne nécessite pas de re-architecturer l'ensemble de votre application.

Nous avons eu des problèmes similaires, où notre page/partiel a un type ViewData.Model bien défini, mais la vue contient un partiel qui est réutilisé sur plusieurs pages. Nous avons également essayé d'éviter d'utiliser ViewDataDictionary. Cependant, nous avons trouvé que le cas que vous décrivez est exactement le scénario EXACT où nous aimons utiliser une entrée ViewDataDictionary. Nous conservons une classe de constantes statique dans notre modèle d'application qui contient des classes internes pour chaque type de constante, y compris les clés ViewData, ce qui fait que nous n'avons pas de chaînes pour que ces choses flottent partout.

Ensuite, notre action Contrôleur remplit la clé ViewData et le partiel dans l'autre page/vérifie partiellement l'existence de cette clé et l'utilise à la place de ViewData.Model. Il rend le travail partiel partout où il le faut et garde votre ViewModel propre. En utilisant des constantes, nous évitons les chaînes brutes partout.

0

Utilisez un filtre ActionFilter pour remplir ViewData avec les informations de menu dont vous avez besoin. Appliquez-le uniquement aux classes et/ou aux méthodes (éventuellement sur une classe de contrôleur de base si nécessaire partout).Créez des méthodes d'extension sur le contrôleur qui rendent l'accès aux données de ViewData fortement typé (et transparent si vous changez son emplacement de stockage plus tard).

J'ai fait récemment a blog post avec une approche similaire (je besoin d'une liste des commanditaires pour afficher sur chaque page). Cela peut vous aider à vous orienter dans la bonne direction.

3

Utilisez-vous un contrôleur de base? Je l'ai trouvé que l'utilisation d'un, et redéfinissant la méthode OnActionExecuting me aider à avoir une place centrale pour garder toute ma logique de la page courante.

0

Juste pour ajouter à cela, RenderAction a été ajouté à MVC2 Beta.

Questions connexes