2009-07-09 11 views
2

J'essaye d'écrire un usercontrol de "menu.ascx" commun dans Asp.Net MVC qui générera un menu HTML correctement formaté pour mon application. Le menu est généré en fonction du contenu de la base de données et d'une série de résolutions de ressources ... transmises à la vue partielle via un attribut sur un ViewModel.Comment puis-je savoir si le OutputCache pour un contrôle donné est utilisé?

Il serait judicieux d'utiliser une directive OutputCache sur le contrôle menu.ascx afin de limiter le nombre d'allers-retours à la base de données et aux fichiers de ressources. Mon intention est de marquer la directive OutputCache avec les attributs VaryByParam = none et VaryByCustom, en implémentant une recherche de sécurité personnalisée dans global.asax ...

Ma question est: comment savons-nous quand OutputCache for menu.ascx va être utilisé, de sorte que nous pouvons passer les opérations de récupération de données lors de la construction du ViewModel dans le contrôleur?


Certains exemples de code UserControl:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<%@ OutputCache VaryByParam="none" VaryByCustom="customstring" %> 
<ul> 
<% var model = (IMyViewModel)Model; 
foreach (var menu in model.Menus) { %> 
    <li><a href="<%= menu.href %>"><%= menu.Text %></a></li> 
<% } %> 
</ul> 

Répondre

0

Je pense que j'ai trouvé une solution de contournement appropriée à mon problème.

Dans la propriété Menus getter pour ma mise en œuvre concrète de ViewModel, j'écris un code proxy pour revenir dans le contrôleur instanciant et demander les données du menu. De cette façon, je peux créer les données de menu à la volée, quand le PartialView le demande. Si la vue partielle sort du OutputCache, la propriété Menu ne sera pas demandée.

Alors, mon IMyViewModel ressemble un peu à ceci:

public interface IMyViewModel { 

    IEnumerable<Menu> Menus { get; } 

    ///<summary> 
    /// A pointer back to the calling controller, which inherits from the abstract MyBaseController 
    ///</summary> 
    MyBaseController Controller { get; set; } 

} 

et ma mise en œuvre concrète des menus ressemble un peu à ceci:

public IEnumerable<Menu> Menus 
{ 
    get { return Controller.GetMenus(); } 
} 

Commentaires? Est-ce une solution viable?

1

est ici readin intéressant sur ce sujet Donut Hole Caching in ASP.NET MVC et ici ASP.NET MVC Result Cache, je essentiellement faire ce menu par la méthode RenderAction en page maître d'invoquer l'action qui va tirer des données de base de données et theb, puis cache le résultat de l'action

+0

RenderAction est uniquement disponible dans les futurs ASP.Net MVC ... Je ne sais pas si nous voulons y aller encore. –