Ich habe diesen Abschnitt in meinem definiert _Layout.cshtml
@RenderSection("Scripts", false)
Ich kann es leicht aus einer Sicht verwenden:
@section Scripts {
@*Stuff comes here*@
}
Ich habe Probleme damit, wie einige Inhalte aus einer Teilansicht in diesen Abschnitt eingefügt werden können.
Nehmen wir an, dies ist meine Ansichtsseite:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
Ich muss einige Inhalte Scripts
aus der _myPartial
Teilansicht in den Abschnitt einfügen.
Wie kann ich das machen?
Antworten:
Abschnitte funktionieren nicht in Teilansichten und das ist beabsichtigt. Sie können einige benutzerdefinierte Helfer verwenden , um ein ähnliches Verhalten zu erzielen, aber ehrlich gesagt liegt es in der Verantwortung der Ansicht, die erforderlichen Skripte einzuschließen, nicht in der Verantwortung des Teils. Ich würde empfehlen, den Abschnitt @scripts der Hauptansicht zu verwenden, um dies zu tun, und die Partials müssen sich nicht um Skripte kümmern.
quelle
Dies ist eine sehr beliebte Frage, daher werde ich meine Lösung veröffentlichen.
Ich hatte das gleiche Problem und obwohl es nicht ideal ist, denke ich, dass es tatsächlich ziemlich gut funktioniert und das Teil nicht von der Ansicht abhängig macht.
Mein Szenario war, dass eine Aktion von selbst zugänglich war, aber auch in eine Ansicht eingebettet werden konnte - eine Google Map.
In meinem habe
_layout
ich:Meiner
index
Ansicht nach habe ich:Aus meiner
clients
Sicht habe ich (alle Karte und Assoc. HTML):Meine
Clients_Scripts
Ansicht enthält das Javascript, das auf der Seite gerendert werden sollAuf diese Weise wird mein Skript isoliert und kann bei Bedarf auf der Seite gerendert werden, wobei das
body_scripts
Tag nur beim ersten Auftreten gerendert wird, wenn die Razor View Engine es findet.Dadurch kann ich alles trennen - es ist eine Lösung, die für mich recht gut funktioniert, andere haben möglicherweise Probleme damit, aber sie flicken das "by design" -Loch.
quelle
Aus den Lösungen in diesem Thread habe ich die folgende wahrscheinlich überkomplizierte Lösung gefunden, mit der Sie das Rendern von HTML (auch Skripten) innerhalb eines using-Blocks verzögern können.
VERWENDUNGSZWECK
Erstellen Sie den "Abschnitt"
Typisches Szenario: Fügen Sie in einer Teilansicht den Block nur einmal ein, unabhängig davon, wie oft die Teilansicht auf der Seite wiederholt wird:
Fügen Sie in einer Teilansicht den Block für jedes Mal ein, wenn der Teil verwendet wird:
Fügen Sie in einer Teilansicht den Block nur einmal ein, unabhängig davon, wie oft der Teil wiederholt wird, und rendern Sie ihn später spezifisch nach Namen
when-i-call-you
:Rendern Sie die "Abschnitte"
(dh den verzögerten Abschnitt in einer übergeordneten Ansicht anzeigen)
CODE
quelle
isOnlyOne
nur dann rendern möchten, wenn er den eindeutigen Schlüssel für den Parameter benötigt , aber nur, wenn Sie ihn an einem bestimmten Ort nach Namen rendern möchten. sonst wird es abgeladenHtml.RenderDelayed()
.Ich hatte dieses Problem und benutzte diese Technik.
Es ist die beste Lösung, die ich gefunden habe und die sehr flexibel ist.
Auch stimmen Sie bitte hier Unterstützung für kumulativen Abschnitt Erklärung hinzufügen
quelle
Wenn Sie ein legitimes Bedürfnis haben, einige
js
von a auszuführenpartial
,jQuery
ist Folgendes erforderlich:quelle
Nach dem unauffälligen Prinzip ist es für "_myPartial" nicht unbedingt erforderlich, Inhalte direkt in den Skriptbereich einzufügen. Sie können diese Skripts für die Teilansicht in eine separate
.js
Datei einfügen und sie in der übergeordneten Ansicht im Abschnitt @scripts referenzieren.quelle
Es gibt einen grundlegenden Fehler in der Art und Weise, wie wir über Web denken, insbesondere bei der Verwendung von MVC. Der Fehler ist, dass JavaScript irgendwie in der Verantwortung der Ansicht liegt. Eine Ansicht ist eine Ansicht, JavaScript (verhaltensbezogen oder anderweitig) ist JavaScript. In Silverlight und dem MVVM-Muster von WPF sehen wir uns mit "Ansicht zuerst" oder "Modell zuerst" konfrontiert. In MVC sollten wir immer versuchen, vom Standpunkt des Modells aus zu argumentieren, und JavaScript ist in vielerlei Hinsicht ein Teil dieses Modells.
Ich würde vorschlagen, das AMD- Muster zu verwenden (ich selbst mag RequireJS ). Trennen Sie Ihr JavaScript in Module, definieren Sie Ihre Funktionalität und schließen Sie sich über JavaScript an Ihr HTML an, anstatt sich beim Laden des JavaScript auf eine Ansicht zu verlassen. Dies wird Ihren Code bereinigen, Ihre Bedenken trennen und das Leben auf einen Schlag erleichtern.
quelle
window
Objekt, und füge Bibliotheksskripte vor Partials ein.Das Ziel des OP ist, dass er Inline-Skripte in seiner Teilansicht definieren möchte. Ich gehe davon aus, dass dieses Skript nur für diese Teilansicht spezifisch ist und diesen Block in seinen Skriptabschnitt aufgenommen hat.
Ich verstehe, dass er diese Teilansicht haben möchte, um in sich geschlossen zu sein. Die Idee ähnelt den Komponenten bei der Verwendung von Angular.
Mein Weg wäre, die Skripte so wie sie sind in der Teilansicht zu belassen. Das Problem dabei ist nun, dass beim Aufrufen der Teilansicht das dortige Skript möglicherweise vor allen anderen Skripten ausgeführt wird (die normalerweise am Ende der Layoutseite hinzugefügt werden). In diesem Fall muss das Partial View-Skript nur auf die anderen Skripte warten. Es gibt verschiedene Möglichkeiten, dies zu tun. Das einfachste, das ich zuvor verwendet habe, ist die Verwendung eines Ereignisses für
body
.In meinem Layout hätte ich unten etwas wie dieses:
Dann in meiner Teilansicht (unten):
Eine andere Lösung besteht darin, einen Stapel zu verwenden, um alle Ihre Skripte zu pushen und jedes am Ende aufzurufen. Eine andere Lösung ist, wie bereits erwähnt, das RequireJS / AMD-Muster, das auch sehr gut funktioniert.
quelle
Die erste Lösung, die ich mir vorstellen kann, ist die Verwendung von ViewBag zum Speichern der Werte, die gerendert werden müssen.
Nur habe ich nie versucht, ob diese Arbeit aus einer Teilansicht, aber es sollte imo.
quelle
ViewBag.RenderScripts = new List<string>();
oben auf der Hauptseite, dann aufgerufen@Html.Partial("_CreateUpdatePartial",Model,ViewData)
, dann setzen@section Scripts {@foreach (string script in ViewBag.RenderScripts) Scripts.Render(script); }}
. In Teilansicht habe ich gesetzt@{ViewBag.RenderScripts = ViewBag.RenderScripts ?? new List<string>();ViewBag.RenderScripts.Add("~/bundles/jquery");}
.Sie müssen keine Abschnitte in der Teilansicht verwenden.
In Ihre Teilansicht aufnehmen. Es führt die Funktion aus, nachdem jQuery geladen wurde. Sie können die Bedingungsklausel für Ihren Code ändern.
Julio Spader
quelle
Sie können diese Erweiterungsmethoden verwenden : (Als PartialWithScript.cs speichern)
Verwenden Sie wie folgt:
Beispiel teilweise: (_MyPartial.cshtml) Fügen Sie das HTML in das if und das js in das else ein.
Fügen Sie in Ihrer _Layout.cshtml oder wo immer Sie möchten, dass die Skripte aus den Partials gerendert werden, Folgendes (einmal) ein: Es wird nur das Javascript aller Partials auf der aktuellen Seite an dieser Stelle gerendert.
Um Ihr Teil zu verwenden, gehen Sie einfach wie folgt vor: Es wird nur das HTML an dieser Stelle gerendert.
quelle
Es gibt eine Möglichkeit, Abschnitte in Teilansichten einzufügen, obwohl dies nicht schön ist. Sie müssen über die übergeordnete Ansicht auf zwei Variablen zugreifen können. Da ein Teil des Zwecks Ihrer Teilansicht darin besteht, diesen Abschnitt zu erstellen, ist es sinnvoll, diese Variablen zu benötigen.
So sieht es aus, wenn Sie einen Abschnitt in die Teilansicht einfügen:
Und auf der Seite die Teilansicht einfügen ...
Mit dieser Technik können Sie auch den Inhalt eines Abschnitts programmgesteuert in einer beliebigen Klasse definieren.
Genießen!
quelle
Plutos Idee auf eine schönere Art:
CustomWebViewPage.cs:
Ansichten \ web.config:
Aussicht:
Teilweise (_BackendSearchForm.cshtml):
Layoutseite:
quelle
Dies funktionierte für mich und ermöglichte es mir, Javascript und HTML für die Teilansicht in derselben Datei zusammen zu finden. Hilft beim Gedankenprozess, HTML und verwandte Teile in derselben Teilansichtsdatei anzuzeigen.
In der Ansicht, die die Teilansicht "_MyPartialView.cshtml" verwendet
In der Teilansichtsdatei
quelle
Ich habe dies auf eine völlig andere Weise gelöst (weil ich es eilig hatte und keinen neuen HtmlHelper implementieren wollte):
Ich habe meine Teilansicht in eine große if-else-Anweisung eingeschlossen:
Dann habe ich das Partial zweimal mit benutzerdefinierten ViewData aufgerufen:
quelle
@Html.Partial("MyPartialViewScripts")
Ich hatte ein ähnliches Problem, bei dem ich eine Masterseite wie folgt hatte:
Die Teilansicht hing jedoch von JavaScript im Abschnitt "Skripte" ab. Ich habe es gelöst, indem ich die Teilansicht als JSON codiert, in eine JavaScript-Variable geladen und diese dann zum Auffüllen eines Div verwendet habe.
quelle
Sie können Ihren Ordner / index.cshtml als Masterseite verwenden und dann Abschnittsskripte hinzufügen. Dann haben Sie in Ihrem Layout:
und Ihre index.cshtml:
und es wird über alle Ihre Teilansichten funktionieren. Es funktioniert für mich
quelle
Mit Mvc Core können Sie einen ordentlichen TagHelper erstellen
scripts
(siehe unten). Dies könnte leicht in einsection
Tag umgewandelt werden, in dem Sie ihm auch einen Namen geben (oder der Name wird vom abgeleiteten Typ übernommen). Beachten Sie, dass die Abhängigkeitsinjektion für eingerichtet werden mussIHttpContextAccessor
.Beim Hinzufügen von Skripten (zB teilweise)
Bei der Ausgabe der Skripte (zB in einer Layoutdatei)
Code
quelle
Nun, ich denke, die anderen Poster haben Ihnen die Möglichkeit gegeben, einen @ -Abschnitt direkt in Ihren Teil aufzunehmen (mithilfe von HTML-Helfern von Drittanbietern).
Ich gehe jedoch davon aus, dass Sie, wenn Ihr Skript eng mit Ihrem Teil verknüpft ist, Ihr Javascript direkt in ein Inline-
<script>
Tag innerhalb Ihres Teils einfügen und damit fertig sind (achten Sie nur auf die Duplizierung des Skripts, wenn Sie das Teil mehr als einmal verwenden möchten in einer einzigen Ansicht);quelle
Angenommen, Sie haben eine Teilansicht mit dem Namen _contact.cshtml. Ihr Kontakt kann ein legaler (Name) oder ein physischer Betreff (Vorname, Nachname) sein. Ihre Ansicht sollte sich darum kümmern, was gerendert wird und was mit Javascript erreicht werden kann. Daher sind möglicherweise verzögertes Rendern und JS-Innenansicht erforderlich.
Der einzige Weg, wie ich denke, wie es weggelassen werden kann, ist, wenn wir eine unauffällige Art des Umgangs mit solchen UI-Problemen schaffen.
Beachten Sie auch, dass MVC 6 eine sogenannte View-Komponente haben wird, sogar MVC-Futures hatten ähnliche Dinge und Telerik unterstützt auch so etwas ...
quelle
Ich habe diesen Code gerade zu meiner Teilansicht hinzugefügt und das Problem gelöst, obwohl es nicht sehr sauber ist, funktioniert es. Sie müssen sicherstellen, dass die IDs der Objekte, die Sie rendern, vorhanden sind.
quelle
Ich hatte das ähnliche Problem damit gelöst:
Das ist eine hübsche Art zu spritzen, denke ich.
quelle