Meine Hauptmotivation für diesen Versuch besteht darin, Javascript zu erhalten, das nur von einem Teil am Ende der Seite mit dem Rest des Javascript und nicht in der Mitte der Seite, auf der der Teil gerendert wird, benötigt wird.
Hier ist ein vereinfachtes Beispiel dafür, was ich versuche:
Hier ist das Layout mit einem Skriptabschnitt direkt vor dem Text.
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
</head>
<body>
@RenderBody()
<script src="@Url.Content("~/Scripts/jquery-1.4.4.min.js")" type="text/javascript"></script>
@RenderSection("Scripts", false)
</body>
</html>
Hier ist eine Beispielansicht mit diesem Layout.
<h2>This is the view</h2>
@{Html.RenderPartial("_Partial");}
@section Scripts {
<script type="text/javascript">
alert("I'm a view.");
</script>
}
Und hier ist der Teil, der aus der Ansicht gerendert wird.
<p>This is the partial.</p>
@* this never makes it into the rendered page *@
@section Scripts {
<script type="text/javascript">
alert("I'm a partial.");
</script>
}
In diesem Beispiel wird das in der Ansicht angegebene Markup in den Abschnitt eingefügt, das Markup aus dem Teil jedoch nicht. Ist es möglich, einen Abschnitt aus einer Teilansicht mit Razor zu füllen? Wenn nicht, welche anderen Methoden gibt es, um Javascript zu erhalten, das nur von Partials am Ende der Seite benötigt wird, ohne es global einzuschließen?
quelle
Antworten:
Ich habe damit umgegangen, indem ich ein paar Erweiterungsmethoden in die HtmlHelper-Klasse geschrieben habe. Auf diese Weise können Teilansichten sagen, dass sie ein Skript benötigen, und dann in der Layoutansicht, die das von mir aufgerufene Tag in meine Hilfsmethode schreibt, um die erforderlichen Skripte auszugeben
Hier sind die Hilfsmethoden:
Sobald Sie dies eingerichtet haben, muss Ihre Teilansicht nur noch aufgerufen werden
@Html.RequireScript("/Path/To/Script")
.Und im Kopfbereich der Layoutansicht rufen Sie an
@Html.EmitRequiredScripts()
.Ein zusätzlicher Bonus ist, dass Sie damit doppelte Skriptanforderungen aussortieren können. Wenn Sie mehrere Ansichten / Teilansichten haben, für die ein bestimmtes Skript erforderlich ist, können Sie davon ausgehen, dass Sie es nur einmal ausgeben
quelle
Teilansichten können nicht an den Abschnitten ihrer übergeordneten Ansichten teilnehmen.
quelle
Sie könnten einen zweiten Teil haben, der nur für das Injizieren des erforderlichen Javascript zuständig ist. Platzieren Sie dort mehrere Skripte um
@if
Blöcke, wenn Sie möchten:Dies könnte natürlich ein bisschen aufgeräumt werden, aber dann im
Scripts
Abschnitt Ihrer Ansicht:Auch hier wird es vielleicht keinen Schönheitspreis gewinnen, aber es wird funktionieren.
quelle
Die elegantere Möglichkeit, dies zu tun, besteht darin, Teilansichts-Skripte in eine separate Datei zu verschieben und sie dann im Ansichtsabschnitt "Skripte" zu rendern:
Die Teilansicht _ Partial.cshtml :
Die Teilansicht _ PartialScripts.cshtml nur mit Skripten:
quelle
Installieren Sie das Nuget- Paket Forloop.HtmlHelpers. Es enthält einige Hilfsprogramme zum Verwalten von Skripten in Teilansichten und Editorvorlagen.
Irgendwo in Ihrem Layout müssen Sie anrufen
Hier werden alle Skriptdateien und Skriptblöcke auf der Seite ausgegeben. Ich würde daher empfehlen, sie nach Ihren Hauptskripten im Layout und nach einem Skriptabschnitt (falls vorhanden) einzufügen.
Wenn Sie das Web Optimization Framework mit Bündelung verwenden, können Sie die Überladung verwenden
Damit wird diese Methode zum Schreiben von Skriptdateien verwendet.
Wenn Sie jetzt Skriptdateien oder -blöcke zu einer Ansicht, Teilansicht oder Vorlage hinzufügen möchten, verwenden Sie diese einfach
Die Helfer stellen sicher, dass nur eine Skriptdateireferenz gerendert wird, wenn sie mehrmals hinzugefügt wird, und sie stellen auch sicher, dass Skriptdateien in der erwarteten Reihenfolge gerendert werden, d. H.
quelle
[Aktualisierte Version] Aktualisierte Version nach der @ Necrocubus-Frage, um Inline-Skripte einzuschließen.
Meine 2 Cent, es ist ein alter Beitrag, aber immer noch relevant. Hier ist ein aktualisiertes Update der Lösung von Herrn Bell, die mit ASP.Net Core funktioniert.
Es ermöglicht das Hinzufügen von Skripten und Stilen zum Hauptlayout aus importierten Teilansichten und Unteransichten sowie das Hinzufügen von Optionen zu Skript- / Stilimporten (wie z. B. asynchrones Verschieben usw.):
quelle
<text>
, fügen Sie es einfach als Zeichenfolge hinzu (Sie können immer noch @ "" für mehrere Zeilen voranstellen, wenn Sie dies bevorzugen) und ohne die<script>
TagsSie können eine neue
Layout
Seite erstellen und die Teilansicht in eine Vollansicht einbinden, die für das Rendern des Inhalts und aller Bibliotheksabschnitte verantwortlich ist.Angenommen, ich habe den folgenden Code:
HomeController.cs
Wenn die Vollseitenansicht gerendert wird, wird sie normalerweise durch Zusammenführen von zwei Dateien gerendert:
About.cshtml
_Layout.cshtml
(oder was auch immer in _ViewStart angegeben oder auf der Seite überschrieben ist)Nun sei angenommen , Sie Render wollte
About.cshtml
als Teilansicht , vielleicht als modale Fenster als Reaktion auf AJAX - Aufruf. Das Ziel hierbei ist, nur den Inhalt zurückzugeben, der auf der About-Seite, den Skripten und allem angegeben ist, ohne dass das_Layout.cshtml
Master-Layout das gesamte Aufblähen enthält (wie ein vollständiges<html>
Dokument).Sie könnten es so versuchen, aber es wird mit keinem der Abschnittsblöcke geliefert:
Fügen Sie stattdessen eine einfachere Layoutseite wie die folgende hinzu:
_PartialLayout.cshtml
Oder um ein modales Fenster wie dieses zu unterstützen:
_ModalLayout.cshtml
Anschließend können Sie in diesem Controller oder einem anderen Handler eine benutzerdefinierte Hauptansicht angeben , mit der Sie den Inhalt und die Skripts einer Ansicht gleichzeitig rendern möchten
quelle
Für diejenigen, die nach der Aspnet Core 2.0-Version suchen:
Fügen Sie Ihrem Layout hinzu, nachdem der Skript-Rendering-Abschnitt aufgerufen wurde:
Und in Ihrer Teilansicht:
quelle
Basierend auf der Antwort von Herrn Bell und Shimmy oben füge ich eine zusätzliche Funktion für das Bundle-Skript hinzu.
Beispiel für PartialView: - @ Html.RequireBundleStyles ("~ / bundles / fileupload / bootstrap / BasicPlusUI / css"); @ Html.RequireBundleScripts ("~ / bundles / fileupload / bootstrap / BasicPlusUI / js");
Beispiel auf MasterPage: - @ Html.EmitRequiredBundleStyles ()
quelle
Verwenden Sie
@using(Html.Delayed()){ ...your content... }
Erweiterungen aus der Antwort https://stackoverflow.com/a/18790222/1037948 , um Inhalte (Skripte oder nur HTML) später auf der Seite zu rendern. InternQueue
sollte die korrekte Bestellung sicherstellen.quelle
Diese Funktionalität ist auch in ClientDependency.Core.Mvc.dll implementiert. Es bietet die HTML-Helfer: @ Html.RequiresJs und @ Html.RenderJsHere (). Nuget-Paket: ClientDependency-Mvc
quelle
Hier ist meine Lösung für die häufig gestellten Fragen "Wie werden Abschnitte aus Teilansichten in Hauptansichten oder Hauptlayoutansichten für asp.net mvc eingefügt?". Wenn Sie den Stapelüberlauf nach den Schlüsselwörtern "Abschnitt + Teil" durchsuchen, erhalten Sie eine ziemlich große Liste verwandter Fragen und Antworten, aber keine davon scheint mir mithilfe der Grammatik der Rasiermaschine elegant zu sein. Ich schaue mir nur die Razor-Engine an, um zu sehen, ob es eine bessere Lösung für diese Frage gibt.
Glücklicherweise fand ich etwas Interessantes für mich, wie die Razor-Engine die Kompilierung für die Ansichtsvorlagendatei (* .cshtml, * .vbhtml) durchführt. (Ich werde es später erklären), unten ist mein Code der Lösung, der meiner Meinung nach recht einfach und elegant genug ist.
Verwendung : Die Verwendung des Codes ist ebenfalls recht einfach und sieht fast genauso aus wie üblich. Es werden auch beliebige Ebenen für die verschachtelten Teilansichten unterstützt. dh. Ich habe eine Ansichtsvorlagenkette: _ViewStart.cshtml-> layout.cshtml-> index.cshtml -> [head.cshtml, foot.cshtml] -> ad.cshtml.
In layout.cshtml haben wir:
Und in index.cshtml haben wir:
Und in head.cshtml hätten wir den Code:
Es ist dasselbe in foot.cshtml oder ad.cshtml. Sie können weiterhin den Kopf- oder Fußabschnitt darin definieren. Rufen Sie @ Html.EnsureSection () einmal am Ende der Teilansichtsdatei auf. Das ist alles, was Sie tun müssen, um das Problem in asp mvc zu beseitigen.
Ich teile nur mein Code-Snippet, damit andere es nutzen können. Wenn Sie der Meinung sind, dass dies nützlich ist, zögern Sie bitte nicht, meinen Beitrag zu bewerten. :) :)
quelle