Tête de page de mise en page:
<head>
<link href="@Url.Content("~/Content/themes/base/Site.css")"
rel="stylesheet" type="text/css" />
</head>
Une vue (AnotherView) de l'application nécessite:
<link href="@Url.Content("~/Content/themes/base/AnotherPage.css")"
rel="stylesheet" type="text/css" />
et AnotherView a une vue partielle (AnotherPartial) qui nécessite:
<link href="@Url.Content("~/Content/themes/base/AnotherPartial.css")"
rel="stylesheet" type="text/css" />
Question: Comment pouvons-nous ajouter ces liens de fichiers CSS AnotherView et AnotherPartial à la tête de mise en page ?
RenderSection n'est pas une bonne idée car AnotherPage peut avoir plusieurs Partials. Ajouter tous les CSS en tête n'est pas utile car cela changera de manière dynamique (cela dépend de Anotherpages).
asp.net-mvc
asp.net-mvc-3
razor
Nuri YILMAZ
la source
la source
Réponses:
Disposition:
Vue:
la source
AddToHead
section est dans une vue partielle intégrée dans leView
.Mise à jour : exemple de base disponible sur https://github.com/speier/mvcassetshelper
Nous utilisons l'implémentation suivante pour ajouter des fichiers JS et CSS dans la page de mise en page.
Vue ou vue partielle:
Page de mise en page:
Extension HtmlHelper:
la source
Insert
méthodes par desAdd
méthodes[ThreadStatic]
, ou, de préférence, stocké dansHttpContext.Items
.Malheureusement, cela n'est pas possible par défaut de l'utiliser
section
comme un autre utilisateur l'a suggéré, car asection
n'est disponible que pour l'immédiatchild
de aView
.Ce qui fonctionne cependant, c'est la mise en œuvre et la redéfinition du
section
dans chaque vue , ce qui signifie:De cette façon, chaque vue peut implémenter une section d'en-tête, pas seulement les enfants immédiats. Cela ne fonctionne que partiellement cependant, en particulier avec plusieurs partiels, les problèmes commencent (comme vous l'avez mentionné dans votre question).
La seule vraie solution à votre problème consiste donc à utiliser le
ViewBag
. Le mieux serait probablement une collection séparée (liste) pour CSS et scripts. Pour que cela fonctionne, vous devez vous assurer queList
utilisé est initialisé avant l'exécution de l'une des vues. Ensuite, vous pouvez faire des choses comme celle-ci en haut de chaque vue / partielle (sans vous soucier si la valeurScripts
ouStyles
est nulle:Dans la mise en page, vous pouvez ensuite parcourir les collections et ajouter les styles en fonction des valeurs du
List
.Je pense que c'est moche, mais c'est la seule chose qui fonctionne.
****** UPDATE **** Puisqu'il commence à exécuter les vues internes en premier et à se frayer un chemin vers la mise en page et que les styles CSS sont en cascade, il serait probablement logique d'inverser la liste de styles via
ViewBag.Styles.Reverse()
.De cette façon, le style le plus extérieur est ajouté en premier, ce qui est en ligne avec le fonctionnement des feuilles de style CSS de toute façon.
la source
Vous pouvez définir la section par la méthode RenderSection dans la mise en page.
Disposition
Ensuite, vous pouvez inclure vos fichiers css dans la zone de section de votre vue, sauf en vue partielle .
La coupe fonctionne en vue, mais ne fonctionne pas en vue partielle par conception .
Si vous souhaitez vraiment utiliser la zone de section en vue partielle, vous pouvez suivre l'article pour redéfinir la méthode RenderSection.
Razor, dispositions imbriquées et sections redéfinies - Marcin sur ASP.NET
la source
J'ai eu un problème similaire et j'ai fini par appliquer l'excellente réponse de Kalman avec le code ci-dessous (pas aussi soigné, mais sans doute plus extensible):
Le projet contient une méthode AssignAllResources statique:
dans la page _layout
et dans le (s) partiel (s) et les vues
la source
J'ai essayé de résoudre ce problème.
Ma réponse est ici.
"DynamicHeader" - http://dynamicheader.codeplex.com/ , https://nuget.org/packages/DynamicHeader
Par exemple, _Layout.cshtml est:
Et, vous pouvez enregistrer des fichiers .js et .css dans «DynamicHeader» où vous le souhaitez.
Par exemple, le bloc de code dans AnotherPartial.cshtm est:
Ensuite, le HTML de sortie final est:
la source
Essayez la solution prête à l'emploi (ASP.NET MVC 4 ou version ultérieure): Try the out-of-the-box solution (ASP.NET MVC 4 or later):
la source
CS0103: The name 'BundleTable' does not exist in the current context
System.Web.Optimization
ieSystem.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles().First(b => b.Path == "~/bundles/css");
Pour ceux d'entre nous qui utilisent ASP.NET MVC 4 - cela peut être utile.
Tout d'abord, j'ai ajouté une classe BundleConfig dans le dossier App_Start.
Voici mon code que j'ai utilisé pour le créer:
Deuxièmement, j'ai enregistré la classe BundleConfig dans le fichier Global.asax:
Troisièmement, j'ai ajouté des helpers de style à mon fichier CSS:
Enfin, j'ai utilisé cette syntaxe dans n'importe quelle vue:
la source
Voici un plugin NuGet appelé Cassette , qui vous offre entre autres la possibilité de référencer des scripts et des styles dans des partiels.
Bien qu'il existe un certain nombre de configurations disponibles pour ce plugin, ce qui le rend très flexible. Voici le moyen le plus simple de référencer des fichiers de script ou de feuille de style:
Selon la documentation :
la source
J'ai écrit un wrapper facile qui vous permet d'enregistrer dynamiquement des styles et des scripts dans chaque vue partielle dans la balise head.
Il est basé sur le jsakamoto de DynamicHeader mis en place, mais il a quelques améliorations et ajustements de performances.
Il est très facile à utiliser et polyvalent.
L'usage:
Vous pouvez trouver le code complet, des explications et des exemples à l'intérieur: Ajouter des styles et des scripts dynamiquement à la balise Head
la source