2010-05-25 12 views
4

Je me demande - quelle est la meilleure façon de fournir des informations contextuelles (c'est-à-dire non liées à une vue particulière, mais à toutes les vues en même temps) à une vue (ou maîtriser page)?Passage des informations contextuelles aux vues dans ASP.NET MVC

Envisagez le scénario suivant. Supposons que nous ayons une application prenant en charge plusieurs langues de l'interface utilisateur. L'utilisateur peut les changer via les widgets de l'interface utilisateur (quelque chose comme des onglets en haut de la page). Chaque langue est affichée sous la forme d'un onglet distinct. L'onglet pour la langue en cours ne doit pas être rendu.

Pour répondre à ces exigences, je prévois d'avoir une pièce javascript qui va cacher l'onglet de langue du client actuel. Pour ce faire, j'ai besoin de l'ID de l'onglet de langue actuel sur le client. Donc, j'ai besoin d'un moyen de passer l'Id à la page maître (pour qu'il soit "fusionné" dans le script js). La meilleure chose que je peux penser est que tous mes ViewModels doivent hériter de ViewModeBase qui a un champ pour contenir l'ID de l'onglet de langue en cours. Ensuite, quel que soit l'affichage que je visualise, cet ID sera toujours disponible pour le script de masquage de la page maître.

Cependant, je crains que ce ViewModelBase peut potentiellement croître de façon incontrôlée que le nombre de ces éléments d'information contextuelle (comme langue courante) augmentera ..

Toutes les idées?

Répondre

1

Si cette information contextuelle est requise par toutes les vues, avoir un modèle de vue de base semble être une bonne solution. La question est de savoir où remplir cette information pour éviter d'encombrer toutes les actions de votre contrôleur. Un custom action filter semble être un bon endroit. Dans la méthode OnActionExecuted, vous pouvez obtenir le modèle de vue renvoyé par l'action du contrôleur et remplir la partie contextuelle si elle dérive du type de base. Une autre option est de mettre les informations contextuelles dans le ViewData (les vues fortement typées peuvent aussi utiliser ViewData) mais personnellement, je déteste avoir des chaînes magiques et faire du casting dans mes vues (ceci pourrait être surmonté en utilisant des helpers HTML qui géreront ça ViewData).

+0

Merci pour la réponse! Pour éviter l'encombrement dans les contrôleurs, je crée mes modèles de vue à travers une usine. Ainsi, l'usine est chargée de remplir les propriétés de ViewModelBase. – Ant

0

Si vous pensez que ViewModeBase va grandir, vous pouvez également faire en sorte que viewmodels implémente une interface.

La vue ou partielle peut avoir le type de cette interface. Cest particulièrement utile si seulement quelques pages ont cette fonctionnalité.

+0

Je vois ce que vous voulez dire. Merci. Mais j'ai juste une intuition qu'il ya une meilleure solution là-bas :) En outre, je ne me souviens pas exactement qui, mais quelqu'un de l'équipe MVC je suppose a commenté dans un blog qu'avoir ViewModelBase à ces fins n'est pas une bonne chose. . – Ant