Certains navigateurs mettent en cache les fichiers js et css, ne les actualisant pas sauf si vous les forcez. Quel est le moyen le plus simple.
Je viens de mettre en œuvre cette solution qui semble fonctionner.
Déclarez une variable de version sur votre page
public string version { get; set; }
Obtenez le numéro de version à partir de la clé web.config
version = ConfigurationManager.AppSettings["versionNumber"];
Dans votre page aspx, faites les appels à javascript et aux feuilles de style comme ceci
<script src="scripts/myjavascript.js?v=<%=version %>" type="text/javascript"></script>
<link href="styles/mystyle.css?v=<%=version %>" rel="stylesheet" type="text/css" />
Donc, si vous définissez la version = 1.1 à partir de 1.0 dans votre web.config, votre navigateur téléchargera les derniers fichiers qui, espérons-le, vous éviteront, à vous et à vos utilisateurs, une certaine frustration.
Existe-t-il une autre solution qui fonctionne mieux, ou cela causera-t-il des problèmes imprévus pour un site Web?
Réponses:
J'ai résolu ce problème en ajoutant un horodatage de la dernière modification en tant que paramètre de requête aux scripts.
Je l'ai fait avec une méthode d'extension et en l'utilisant dans mes fichiers CSHTML. Remarque: cette implémentation met en cache l'horodatage pendant 1 minute afin de ne pas trop écraser le disque.
Voici la méthode d'extension:
Et puis dans la page CSHTML:
Dans le HTML rendu, cela apparaît comme:
la source
Votre solution fonctionne. C'est assez populaire en fait.
Even Stack Overflow utilise une méthode similaire:
Où
v=6184
est probablement le numéro de révision SVN.la source
Dans ASP.NET Core (MVC 6), cela fonctionne directement via le
asp-append-version
tag helper:la source
ASP.NET MVC gérera cela pour vous si vous utilisez des bundles pour votre JS / CSS. Il ajoutera automatiquement un numéro de version sous la forme d'un GUID à vos bundles et ne mettra à jour ce GUID que lorsque le bundle est mis à jour (c'est-à-dire que tous les fichiers source ont des changements).
Cela aide également si vous avez une tonne de fichiers JS / CSS car cela peut grandement améliorer les temps de chargement du contenu!
Vois ici
la source
Il existe un moyen intégré dans asp.net pour cela: le regroupement . Utilisez-le simplement. Chaque nouvelle version aura le suffixe unique "? V = XXXXXXX". En mode débogage, le regroupement est désactivé, pour activer le paramètre make dans web.config:
Ou ajoutez à la méthode RegisterBundles (BundleCollection bundles):
Par exemple:
BundleConfig.cs:
_Layout.cshtml:
la source
Il y a une réponse plus simple à cela que la réponse donnée par l'op dans la question (l'approche est la même):
Définissez la clé dans le web.config:
Faites l'appel à appsettings directement depuis la page aspx:
la source
Basé sur la réponse d'Adam Tegan , modifiée pour une utilisation dans une application de formulaires Web.
Dans le code de classe .cs:
Dans le balisage aspx:
Et dans le HTML rendu, il apparaît comme
la source
Fait intéressant, ce site même a des problèmes avec l'approche que vous décrivez en relation avec certaines configurations de proxy, même s'il devrait être à sécurité intégrée.
Consultez cette discussion Meta Stack Overflow .
Donc, à la lumière de cela, il peut être judicieux de ne pas utiliser un paramètre GET pour mettre à jour, mais le nom du fichier réel:
même si c'est plus de travail à faire, car vous devrez créer le fichier ou créer une réécriture d'URL pour celui-ci.
la source
Je voulais une simple doublure pour rendre le chemin unique pour casser la cache. Cela a fonctionné pour moi:
Si le fichier a été modifié depuis la dernière fois qu'il a été chargé sur la page, le navigateur extraira le fichier mis à jour.
Il génère le
last modified
tampon à partir du.js
fichier et le place là-dedans au lieu de la version à laquelle il peut ne pas être facile d'accéder.Une autre option pourrait être d'obtenir la somme de contrôle du fichier.
la source
Voici une approche qui fonctionne avec ASP.NET 5 / MVC 6 / vNext .
Étape 1: Créez une classe pour renvoyer la dernière heure d'écriture du fichier, similaire aux autres réponses de ce fil. Notez que cela nécessite une injection de dépendances ASP.NET 5 (ou autre).
Étape 2: Enregistrez le service à injecter dans startup.cs :
Étape 3: Ensuite, dans ASP.NET 5, il est possible d'injecter le service directement dans une vue de mise en page telle que _Layout.cshtml comme ceci:
Certaines touches finales pourraient être apportées pour mieux combiner les chemins physiques et gérer le nom du fichier dans un style plus cohérent avec la syntaxe, mais c'est un point de départ. J'espère que cela aidera les gens à passer à ASP.NET 5.
la source
J'ai utilisé une technique légèrement différente dans mon site aspnet MVC 4:
_ViewStart.cshtml:
Puis dans les vues réelles:
la source
<?php $rand_no = rand(10000000, 99999999)?> <script src="scripts/myjavascript.js?v=<?=$rand_no"></script>
Cela fonctionne pour moi dans tous les navigateurs. Ici, j'ai utilisé PHP pour générer des non aléatoires. Vous pouvez utiliser votre propre langue côté serveur. »
la source
À partir de la réponse ci - dessus, j'ai modifié un peu le code pour que l'assistant fonctionne également avec les fichiers CSS et ajoute une version à chaque fois que vous modifiez les fichiers et pas seulement lorsque vous faites la construction
la source
Obtenir l'heure de modification du fichier, comme indiqué ci-dessous
Ajoutez ceci avec l'entrée en tant que chaîne de requête
Appelez cela à partir du balisage.
Approche MVC Extension Helper
Ajouter une méthode d'extension
Ajouter cet espace de noms dans web.config
Utilisez-le dans la vue comme
la source
Suggestions préalables simplifiées et fourniture de code pour les développeurs .NET Web Forms.
Cela acceptera les URL relatives ("~ /") et absolues dans le chemin du fichier vers la ressource.
Mettez dans un fichier de classe d'extensions statiques, ce qui suit:
Et puis appelez-le dans votre page maître comme tel:
la source
Sur la base de la réponse ci-dessus, j'ai écrit une petite classe d'extension pour travailler avec les fichiers CSS et JS:
Au lieu d'écrire quelque chose comme:
Vous pouvez maintenant écrire:
Ie simplement remplacer
Url.Content
parUrl.VersionedContent
.Les URL générées ressemblent à ceci:
Si vous utilisez la classe d'extension, vous souhaiterez peut-être ajouter une gestion des erreurs au cas où l'
MapPath
appel ne fonctionnerait pas, car ilcontentPath
ne s'agit pas d'un fichier physique.la source
J'utilise une manière similaire de faire la même chose que vous faites sans modifier chaque page. Ajout d'un événement PreRender dans le fichier maître. Il maintient ma logique au même endroit et s'applique aux fichiers js et css.
la source
Vous pouvez remplacer la propriété DefaultTagFormat des scripts ou des styles.
la source
Pour résoudre ce problème dans mon application ASP.Net Ajax, j'ai créé une extension, puis j'ai appelé dans la page maître.
Pour plus de détails, vous pouvez passer par le lien .
la source
Un moyen simple et intelligent d'implémenter le contrôle de version css dans l'application .net par le concept ci-dessous .. pas besoin d'écrire du code back-end.
la source
Le principal problème avec cette méthode est principalement que vous devrez vous rappeler de mettre à jour votre numéro de version dans votre code chaque fois que vous apportez des modifications à vos fichiers css ou js.
Une meilleure façon de le faire est de définir un paramètre unique garanti avec chacun de vos fichiers css ou js, comme ceci:
Cela oblige les fichiers à être demandés au serveur à chaque fois, ce qui signifie également que votre site ne sera pas aussi performant lors du chargement de la page, car ces fichiers ne seront jamais mis en cache et utiliseront à chaque fois une bande passante inutile.
Essentiellement, si vous vous souvenez de mettre à jour le numéro de version chaque fois qu'une modification est apportée, vous pouvez vous en sortir avec la façon dont vous le faites.
la source
Pour les pages ASP.NET, j'utilise les éléments suivants
AVANT
APRÈS (rechargement forcé)
L'ajout de DateTime.Now.Ticks fonctionne très bien.
la source