J'utilise l'attribut de cache de sortie dans le contrôleur de base ASP.NET MVC, mais il est appelé à chaque fois, car il est interrompu. Existe-t-il une option pour appeler la méthode uniquement onetime pour charger toutes les valeurs par défaut?
protected override void OnActionExecuting(ActionExecutingContext filterContext) { GetDefaults(); base.OnActionExecuting(filterContext); } [OutputCache(Duration = 60000)] private ActionResult GetDefaults() { //code to load all my default values // Viewdata values used in all pages in my aplication // Viewdata values used in all pages in my aplication // Viewdata values used in all pages in my aplication return null; }
3 Réponses :
Il n'y a aucun moyen de tirer parti du moteur de cache ici. La raison est évidente si vous considérez pourquoi il fonctionne réellement, lorsqu'une action est appelée, il n'est jamais le code d'utilisateur qui l'appelait, c'est toujours le cadre MVC qui fait. De cette façon, cela a une chance d'appliquer la mise en cache. Dans votre exemple, le code d'utilisateur appelle directement la méthode, il n'y a pas d'indirection ici, juste un ancien appel clair - aucune mise en cache n'est impliquée. p>
Toute autre meilleure pratique pour charger toutes les valeurs par défaut pour toutes les pages et les mettre en cache?
Vous pouvez utiliser soit Application_Start () ou Session_Start () dans le global.aSax.cs pour stocker des données une seule fois selon que vous souhaitez que les données soient actualisées sur Démarrage de l'application ou par session START. Ce serait à la hauteur de votre demande à faire. p>
Avoir un contrôleur de base comme vous l'avez fait est bon si vous avez besoin de quelque chose à faire pour chaque action. L'étant le plus courant du filtre [Autoriser] que vous devez faire pour chaque action pour voir si l'utilisateur est autorisé pour des raisons de sécurité. Une autre façon de le faire est également d'écrire votre propre actionfilterattribute et de faire la partie de mise en cache que vous devez faire. Ensuite, tout ce que vous avez à faire est d'ajouter ce nouveau filtre d'action à l'une des actions que vous devez faire cette mise en cache. Moyens voient ici pour comment faire cela: HTTPS: //msdn.microsoft.com/en-us/library/dd410056(v=vs.98).aspx Mais puisque vous voulez que les données ne se chargent qu'une fois que je pense qu'un filtre d'action peut ne pas être le bon endroit pour faire la mise en cache. p>
Si tout ce que vous voulez, c'est cache Data em>, alors aussi, je Recommander contre l'utilisation d'une classe de contrôleur de base . Ceci est sûr de dire que vous mélangerez la logique pour Feature A em> et fonctionnalité B EM> et C EM> dans le même contrôleur de base - vous créez un objet de Dieu . MVC a une meilleure façon - filtres qui peut être enregistré pour exécuter pour toutes les actions et peut être utilisé sur des actions spécifiques si vous les utilisez conjointement avec des filtres. P> Bien que, il pourrait y avoir de tout point d'utiliser un filtre mondial pour votre cache, car Normalement, les données sont mises en cache au point il est demandé em>, j'ai créé une démonstration de la façon dont cela pourrait être fait. Notez que la mise en cache est un sujet très large qui peut être fait de nombreuses façons, mais comme vous avez fourni aucune information em> à propos de ce qui est mis en cache, quelle est la source des données, ou comment elle est utilisée, Je ne montre que cela comme une solution possible. P> Nous avons un filtre d'action qui fait la mise en cache. Étant donné que les filtres d'action sont garantis à courir avant la vue, c'est une solution à laquelle cela pourrait être fait. P> SortieCache code> n'est pas le bon mécanisme.
SortieCache Code> Peut être utilisé pour mettre en cache le HTML généré par une méthode d'action afin qu'il ne soit pas à régénérer. Si vous souhaitez mettre en cache des données, vous pouvez le faire facilement en utilisant
httpcontextbasebasebasebasebasebasebasebase.cache code>.
MyCachefilter H2>
myCacheFilter code> 3 choses: p>
<p>
value1: @this.Context.GetMyDefault("value1")<br />
value2: @this.Context.GetMyDefault("value2")<br />
value3: @this.Context.GetMyDefault("value3")<br />
</p>
Encore une autre raison de N'utilisez jamais un contrôleur de base dans MVC ! Si vous avez des contenus partagés qui doivent être mis en cache quelle que soit la page la parille en premier, utilisez un filtre global pour le cacher . La sortieCache est pour ... puits ... Sortie. Si vous devez mettre en cache des données, vous devez utiliser
httpcontext.cache code> ou
system.runtime.caching.memorycache code>.
Vous mélangez le cache de sortie avec le cache d'application et il n'a rien à voir avec la méthode étant dans le contrôleur de base.
Quel est le cache d'application ici. Pourriez-vous s'il vous plaît ajouter plus de détails.
Stackoverflow.com/a/23943993/1743997