Désactiver la mise en cache sur une vue partielle en MVC 3
J'ai un problème avec une Vue partielle sur la mise en cache quand il ne devrait pas l'être. Cette vision partielle est utilisée pour l'affichage de l'ouverture/Fermeture de session sur une page. Il utilise le simple code ci-dessous pour déterminer quel lien pour afficher
@if(Request.IsAuthenticated) {
<a href="@Url.Action("LogOff", "Account", new { area = "" })">Log Off</a>
}
else {
<a href="@Url.Action("LogOn", "Account", new { area = "" })">Log On</a>
}
Cette vision partielle est appelé à partir de toutes les pages dans mon MVC3 application, à l'aide de
@Html.Partial("_HeaderView")
Dans la plupart de mes contrôleurs, j'ai le cache de sortie définie, donc je peux profiter de la mise en cache le contenu de mon.
[OutputCache(Duration = 86400, VaryByParam = "*")]
Maintenant mon problème est que l'ensemble de la page est mise en cache lorsque je ne veux pas la vue partielle de l'être. Ceci est à l'origine de mauvais comportement où dans il affiche parfois la Fermeture de session, même si l'utilisateur n'est pas connecté etc. Est-il un moyen pour mettre en cache tout le contenu, sauf pour la vue partielle en question?
- Nick, désolé dû ajouter le commentaire ici. De toute façon, il fonctionne quand je supprimer le Nostore et changé la durée à 1. Le seul problème maintenant, c'est lorsque l'utilisateur se connecte, elles sont prises à la page d'accueil mais j'ai explicitement l'actualiser pour que les modifications prennent effet (pour montrer la déconnexion au lieu de l'ouverture de session).
Vous devez vous connecter pour publier un commentaire.
Ce que vous cherchez est appelé Beignet de mise en Cache. Voici un excellent article expliquant ce que c'est et comment le faire fonctionner http://www.devtrends.co.uk/blog/donut-output-caching-in-asp.net-mvc-3
Vous pouvez désactiver la mise en cache par la décoration de la manette qui affiche votre _HeaderView partielle avec les éléments suivants:
NoStore
etDuration
paramètres. En fait je ne spécifié leNoStore = true
au premier abord mais j'ai reçu un message d'erreur indiquant queDuration
était nécessaire. Après la passation deDuration = 0
tout semble fonctionner comme prévu déjà. Pouvez-vous confirmer? Je voudrais avoir le moins de code possible, d'autant plus lorsque nous traitons avec des chaînes codées en dur.Location = OutputCacheLocation.None
au lieu deDuration = 0
aussi, ce qui est encore plus clair 🙂System.InvalidOperationException: OutputCacheAttribute for child actions only supports Duration, VaryByCustom, and VaryByParam values. Please do not set CacheProfile, Location, NoStore, SqlDependency, VaryByContentEncoding, or VaryByHeader values for child actions.
System.InvalidOperationException: Duration must be a positive number
Location
soit comme indiqué dans le message d'erreur. Nous avons fini par utiliser le beignet de la mise en cache de la technique.Nous devrions mettre en cache dans le profil Web.fichier de configuration au lieu de mettre en cache les valeurs individuellement dans des pages pour éviter de code redondant. On peut consulter le profil en utilisant le CacheProfile propriété de la OutputCache attribut. Ce profil de cache sera appliqué à toutes les pages sauf la page/méthode remplace ces paramètres.
Et si vous souhaitez désactiver la mise en cache de votre action qui renvoie vue partielle [_HeaderView], vous pouvez remplacer le cache de configuration des paramètres par la décoration de l'action méthode comme indiqué ci-dessous:
Espère que cela vous aidera!
ce travail pour moi..
A pris un peu de temps pour celui-ci après le retour en MVC. Il suffit de mettre la valeur du paramètre Cache directement dans l'Partielle de la Vue d'en-Tête. Comme lors de l'affichage du nom d'utilisateur. Pas besoin de global ou le code côté serveur. Seul problème, une fois qu'une page est en cache, il ne mettra pas à jour immédiatement après la connexion. Mais nous gardons la vitesse si nécessaire, dans la phase initiale de la navigation pour les produits. Ok compromis dans notre cas.