2009-06-24 13 views
0

J'essaie de trouver un bon moyen d'avoir des membres «globaux» (tels que CurrentUser, Theme etc.) dans tous mes partiels ainsi que dans mes opinions. Je ne veux pas avoir de classe logique qui puisse retourner ces données (comme BL.CurrentUser) Je pense qu'il doit faire partie du Modèle dans mes vues J'ai donc essayé d'hériter de BaseViewData avec ces membres. Dans mes contrôleurs, de cette façon ou d'une autre (un filtre ou une méthode de base dans mon BaseController), je crée une instance de la classe héritière et la transmets en tant que données de vue. Tout est parfait jusqu'à ce point, parce que j'ai mes données de vue disponibles sur la vue principale avec les membres de la base. Mais qu'en est-il des partiels?Afficher les modèles (ViewData), UserControls/Partials et les variables globales - meilleure pratique?

Si j'ai une partie simple qui a besoin d'afficher un billet de blog alors il ressemble à ceci:

<%@ Control Language="C#" AutoEventWireup="true" Inherits="ViewUserControl<Post>" %> 

et code simple pour rendre cette partie à mon avis (que ses model.Posts est IEnumerable<Post>):

<%foreach (Post p in this.Model.Posts) {%> 
    <%Html.RenderPartial("Post",p); %> 
<%}%> 

Puisque le modèle partiel n'est pas BaseViewData, je n'ai pas accès à ces propriétés. Par conséquent, j'essayé de faire une classe nommée PostViewData qui hérite de BaseViewData, mais mon point de vue, qui comportent un code pour créer réellement le PostViewData en eux afin de passer à la partie:

<%Html.RenderPartial("Post",new PostViewData { Post=p,CurrentUser=Model.CurrentUser,... }); %> 

Ou je pouvais utiliser un constructeur de copie

<%Html.RenderPartial("Post",new PostViewData(Model) { Post=p }); %> 

Je me demande simplement s'il existe un autre moyen de l'implémenter avant de poursuivre.

Des suggestions?

Merci!

Répondre

0

Avez-vous envisagé de conserver ces éléments dans la session et d'écrire un wrapper fortement typé autour de la session pour accéder à ces informations? Ensuite, dans n'importe quelle vue, vous pouvez simplement créer une nouvelle classe wrapper avec la propriété Session de ViewPage (ou ViewUserControl) et l'utiliser.

+0

Je ne pense pas que Session soit la solution car il est stocké sur le serveur depuis longtemps, mais vous m'avez donné une nouvelle direction pour penser à: utiliser HttpContext.Current.Items, et laisser le BaseViewData récupérer les données à partir de là . Lorsqu'une action prépare Initial ViewData, BaseViewData stocke les données dans HttpContext.Current.Items (à l'aide de setters BaseViewData) et lorsque les autres partiels accéderont à ces propriétés, ils seront lus à partir de HttpContext.Current.Items (à l'aide de getters BaseViewData) . Toujours à la recherche d'une solution plus élégante, même si cela sonne mieux. Merci! – elado

+1

Vos exemples: utilisateur actuel, thème - semblent être de bons candidats à garder pour toute la session. Avez-vous d'autres propriétés "globales" qui ne correspondent pas à ce moule? – tvanfosson

Questions connexes