Layout Seitenkopf:
<head>
<link href="@Url.Content("~/Content/themes/base/Site.css")"
rel="stylesheet" type="text/css" />
</head>
Eine Ansicht (AnotherView) aus der Anwendung benötigt:
<link href="@Url.Content("~/Content/themes/base/AnotherPage.css")"
rel="stylesheet" type="text/css" />
und AnotherView hat eine Teilansicht (AnotherPartial), die Folgendes benötigt:
<link href="@Url.Content("~/Content/themes/base/AnotherPartial.css")"
rel="stylesheet" type="text/css" />
Frage: Wie können wir hinzufügen , diese CSS - Dateien verknüpft AnotherView und AnotherPartial Links zu Layout - Kopf ?
RenderSection ist keine gute Idee, da AnotherPage mehr als eine Partials haben kann. Das Hinzufügen aller CSS zu head ist nicht sinnvoll, da sich die Dynamik ändert (dies hängt von Anotherpages ab).
asp.net-mvc
asp.net-mvc-3
razor
Nuri YILMAZ
quelle
quelle
Antworten:
Layout:
Aussicht:
quelle
AddToHead
Abschnitt in einer Teilansicht befindet, die in die eingebettet istView
.Update : Basisbeispiel verfügbar unter https://github.com/speier/mvcassetshelper
Wir verwenden die folgende Implementierung, um JS- und CSS-Dateien zur Layoutseite hinzuzufügen.
Ansicht oder Teilansicht:
Layoutseite:
HtmlHelper-Erweiterung:
quelle
Insert
Methoden durchAdd
Methoden[ThreadStatic]
oder vorzugsweise in gelagert werdenHttpContext.Items
.Leider ist dies standardmäßig nicht möglich,
section
wie von einem anderen Benutzer vorgeschlagen, da asection
nur für den unmittelbaren Zugriffchild
von a verfügbar istView
.Was jedoch funktioniert, ist die Implementierung und Neudefinition der
section
in jeder Ansicht , was bedeutet:Auf diese Weise kann jede Ansicht einen Kopfabschnitt implementieren, nicht nur die unmittelbaren Kinder. Dies funktioniert jedoch nur teilweise, insbesondere bei mehreren Teilbereichen beginnen die Probleme (wie Sie in Ihrer Frage erwähnt haben).
Die einzige wirkliche Lösung für Ihr Problem ist die Verwendung von
ViewBag
. Das Beste wäre wahrscheinlich eine separate Sammlung (Liste) für CSS und Skripte. Damit dies funktioniert, müssen Sie sicherstellen, dass dieList
verwendete Ansicht initialisiert wird, bevor eine der Ansichten ausgeführt wird. Dann können Sie solche Dinge oben in jeder Ansicht / jedem Teil ausführen (ohne sich darum zu kümmern, ob der WertScripts
oderStyles
null ist:Im Layout können Sie dann die Sammlungen durchlaufen und die Stile basierend auf den Werten in der hinzufügen
List
.Ich finde es hässlich, aber es ist das einzige, was funktioniert.
****** UPDATE **** Da zuerst die inneren Ansichten ausgeführt werden und sich das Layout herausarbeitet und die CSS-Stile kaskadieren, ist es wahrscheinlich sinnvoll, die Stilliste über umzukehren
ViewBag.Styles.Reverse()
.Auf diese Weise wird zuerst der äußerste Stil hinzugefügt, was der Funktionsweise von CSS-Stylesheets entspricht.
quelle
Sie können den Abschnitt mit der RenderSection- Methode im Layout definieren.
Layout
Anschließend können Sie Ihre CSS-Dateien mit Ausnahme der Teilansicht in den Abschnittsbereich Ihrer Ansicht aufnehmen .
Der Abschnitt funktioniert in der Ansicht, jedoch nicht in der Teilansicht .
Wenn Sie den Abschnittsbereich wirklich in einer Teilansicht verwenden möchten, können Sie dem Artikel folgen, um die RenderSection-Methode neu zu definieren.
Rasiermesser, verschachtelte Layouts und neu definierte Abschnitte - Marcin On ASP.NET
quelle
Ich hatte ein ähnliches Problem und wandte Kalmans ausgezeichnete Antwort mit dem folgenden Code an (nicht ganz so ordentlich, aber wohl erweiterbarer):
Das Projekt enthält eine statische AssignAllResources-Methode:
auf der _layout Seite
und in den Teilen und Ansichten
quelle
Ich habe versucht, dieses Problem zu lösen.
Meine Antwort ist hier.
"DynamicHeader" - http://dynamicheader.codeplex.com/ , https://nuget.org/packages/DynamicHeader
Zum Beispiel ist _Layout.cshtml:
Außerdem können Sie .js- und .css-Dateien bei "DynamicHeader" registrieren, wo immer Sie möchten.
Der Codeblock in AnotherPartial.cshtm lautet beispielsweise:
Dann lautet die endgültige Ausgabe von HTML:
quelle
Probieren Sie die sofort einsatzbereite Lösung aus (ASP.NET MVC 4 oder höher):
quelle
CS0103: The name 'BundleTable' does not exist in the current context
System.Web.Optimization
dhSystem.Web.Optimization.BundleTable.Bundles.GetRegisteredBundles().First(b => b.Path == "~/bundles/css");
Für diejenigen von uns, die ASP.NET MVC 4 verwenden, kann dies hilfreich sein.
Zuerst habe ich eine BundleConfig-Klasse im Ordner App_Start hinzugefügt.
Hier ist mein Code, mit dem ich ihn erstellt habe:
Zweitens habe ich die BundleConfig-Klasse in der Datei Global.asax registriert:
Drittens habe ich meiner CSS-Datei Stil-Helfer hinzugefügt:
Schließlich habe ich diese Syntax in jeder Ansicht verwendet:
quelle
Hier ist ein NuGet- Plugin namens Cassette , mit dem Sie unter anderem Skripte und Stile in Partials referenzieren können.
Es gibt jedoch eine Reihe von Konfigurationen für dieses Plugin, was es sehr flexibel macht. Hier ist die einfachste Möglichkeit, auf Skript- oder Stylesheet-Dateien zu verweisen:
Laut Dokumentation :
quelle
Ich habe einen einfachen Wrapper geschrieben, mit dem Sie Stile und Skripte in jeder Teilansicht dynamisch im Head-Tag registrieren können.
Es basiert auf dem DynamicHeader jsakamoto, bietet jedoch einige Leistungsverbesserungen und -verbesserungen.
Es ist sehr einfach zu bedienen und vielseitig.
Die Verwendung:
Den vollständigen Code, Erklärungen und Beispiele finden Sie im Folgenden : Stile und Skripte dynamisch zum Head Tag hinzufügen
quelle