MVC4 - Groupement ne fonctionne pas lorsque les optimisations sont a la valeur true
Je me demande ce que je ne fais pas de corriger ici. Je suis à l'aide de ASP.NET C# MVC4 et je tiens à profiter de l'utilisation de nouvelles css/js fonctionnalité d'optimisation.
Voici mon code HTML partie
@Styles.Render("~/content/css")
Voici mon BunduleConfig.cs
partie
bundles.Add(new StyleBundle("~/content/css").Include(
"~/content/css/reset.css",
"~/content/css/bla.css"));
//BundleTable.EnableOptimizations = true;
De sortie (travaux):
<link href="/content/css/reset.css" rel="stylesheet"/>
<link href="/content/css/bla.css" rel="stylesheet"/>
Cependant, quand je décommentez BundleTable.EnableOptimizations = true;
html de sortie ressemble à ceci
<link href="/content/css?v=5LoJebKvQJIN-fKjKYCg_ccvmBC_LF91jBasIpwtUcY1" rel="stylesheet"/>
Et ce est, bien sûr, est 404. Je n'ai aucune idée de l'endroit où j'ai fait quelque chose de mal, s'il vous plaît aider, première fois de travailler avec MVC4.
- Qu'advient-il si vous créez ~de contenu/css/reset.min.css et bla.min.fichiers css, EnableOptimizations=true tend à rechercher?
- encore 404.
- Je viens de créer un projet vide et essayé avec deux
css
fichiers et la même chose s'est produite. Peut-être que c'est parce que j'ai mis mes fichiers css dans/content/css/
dossier et pas seulement/content/
cependant j'en doute...
Vous devez vous connecter pour publier un commentaire.
J'imagine que le problème est de vous mettre le paquet à une URL virtuelle qui existe réellement, mais est un répertoire.
MVC est de faire un fichier virtuel à partir de votre faisceau et de servir dans le chemin que vous spécifiez que le bundle chemin.
La bonne solution pour ce problème est d'utiliser un bundle chemin qui n'est pas directement la carte à un répertoire existant, et utilise à la place un fichier virtuel nom (qui a également ne correspond pas à une véritable nom de fichier) à l'intérieur de ce répertoire.
Exemple:
Si votre site a un dossier nommé /content/css, faites votre css bundle comme suit:
Dans BundleConfig.cs:
Et sur la page:
Noter que ceci suppose que vous n'avez PAS un fichier nommé AllMyCss.css dans votre répertoire css.
Je ne suis pas sûr si c'est de l'optimisation web, ou WebGrease qui est si pointilleux, mais l'un (ou les deux) d'entre eux est et vous devez être extrêmement prudent.
Tout d'abord il n'y a rien de mal avec votre code:
En fait, c'est exactement ce que fait Microsoft. La principale raison pour laquelle ils ne pas utilisation
~/bundles
pour le css, c'est que les chemins d'accès relatifs se faire défoncer jusqu'pour les images. Pensez à comment votre navigateur voit un bundle - exactement de la même manière qu'elle voit toute autre URL, et tout le chemin normal liées règles continuent de s'appliquer à l'égard des chemins relatifs. Imaginez que votre css avait un chemin de l'image à../images/bullet.png
. Si vous avez été en utilisant~/bundles
le navigateur serait à la recherche dans un répertoire au-dessus debundles
qui n'existe pas réellement. Il sera probablement jusqu'à la fin la recherche dans~/images
où vous avez probablement dans~/content/images
.J'ai trouvé un couple de choses qui peuvent vraiment casser et de provoquer des erreurs 404:
Content/CSS
qui contient unimages
dossier CSS pour les images.EnableOptimizations=true
pour forcer l'utilisation de faisceaux lors des tests deDisons que nous sommes en train de développer un site sur les chats. Vous pouvez avoir cette
Cela génère un lien CSS de ce chemin dans votre code HTML:
Toutefois cela donne un 404 parce que j'ai mis une extension .css et IIS (je pense) devient confus.
Si je l'ai changer pour cela, alors qu'il fonctionne très bien:
Un autre problème déjà souligné par d'autres est que vous ne devez pas faire
si vous avez un css de répertoire ou de fichier (peu probable que vous auriez un fichier appelé
css
sans extension) dans votreContent
répertoire.Une astuce supplémentaire est que vous devez vous assurer que votre code HTML généré a un numéro de version
Si elle ne l'est pas et ressemble à ceci, alors vous avez probablement n'avez pas de correspondance exacte pour le nom du bundle entre votre Bundle table et dans votre cshtml fichier.
new StyleBundle("~/content/css")
est fine et recommandé, mais également qu'il n'est pas très bien si vous avez uncss
dossier dans votrecontent
répertoire (qui est un joli programme d'installation standard).N'oubliez pas d'assurer le regroupement HttpModule est là.
Cela m'a piqué la première fois autour. Vous ne savez pas si l'nécessaires à la configuration doit être ajouté par le package NuGet, mais il n'était pas dans mon cas.
Qui semble correct pour moi. Lorsque les optimisations sont activées, vous n'aurez qu'une seule ref et ce sera pour le nom que vous avez spécifié dans votre StyleBundle (/content/css). Dans le mode de débogage (ou plus précisément avec debug=false dans votre configuration web), vous obtiendrez la non optimisation des fichiers comme d'habitude. Si vous regardez bien, vous verrez qu'ils sont tout simplement le texte que vous avez tapé eux. Toutefois, lorsque optimzations sont activés (habituellement, lorsque vous exécutez en mode release), vous obtiendrez un bizarre à la recherche de l'URL à la place.
Si vous chercher à la sortie de que ça va être minimisé. La chaîne de Requête ?v=5KLoJ.... est basé sur un algorithme de hachage pris les fichiers dans le bundle. C'est alors que la référence peut être en toute sécurité HTTP mises en cache pour aussi longtemps que vous le souhaitez. Pour toujours, si vous avez envie, mais je pense la valeur par défaut est de un an. Toutefois, si vous modifiez l'un de vos feuilles de style, il va générer une nouvelle table de hachage et que la "cache-busting" de sorte que vous aurez une nouvelle copie sur le navigateur.
Après avoir dit tout cela, je ne suis pas sûr de savoir pourquoi vous obtenez une erreur 404. Je soupçonne qui a quelque chose à faire avec votre configuration de routage ou de votre installation IIS. Êtes-vous en cours d'exécution dans Visual Studio avec IISExpress?
Je viens résolu un problème similaire. Le problème était que suivre, j'ai installé "choisie" par
NuGet
.Et dans le
BundleConfig
classe, la ligne qui inclus leCSS
fichier ressemble à ceci:Certains là où le bas dans cette classe, j'ai eu cette ligne:
Le correctif a été de combiner les 2
bundles.Add()
comme suit:Et qu'il fixe pour moi.
BundleTable.EnableOptimizations = true;
a fait le tour!Elle aussi pourrait être parce que vous n'avez pas déployé bundleconfig.json pour le serveur pour une raison quelconque.