Die Injektion Inhalte in bestimmte Abschnitte eine teilweise Ansicht ASP.NET MVC 3 mit Razor View Engine
Habe ich in diesem Abschnitt definiert in meinem _Layout.cshtml
@RenderSection("Scripts", false)
Kann ich problemlos verwenden, es aus einer Sicht:
@section Scripts {
@*Stuff comes here*@
}
Was ich mit zu kämpfen ist, wie man einige Inhalte injiziert in diesem Abschnitt von einer Teilansicht.
Nehmen wir an, das ist meine Ansicht-Seite:
@section Scripts {
<script>
//code comes here
</script>
}
<div>
poo bar poo
</div>
<div>
@Html.Partial("_myPartial")
</div>
Muss ich Spritzen einige Inhalte in der Scripts
Abschnitt von _myPartial
Teilansicht.
Wie kann ich dies tun?
für alle, die zu uns kommen, später - es wird ein nuget-Paket für den Umgang mit diesem: nuget.org/packages/Forloop.HtmlHelpers
Sie sollten diese Frage beantworten. +1 das nuget-Paket löst das problem genauer OP ist.
NuGet-Paket ist keine Lösung, den code des Pakets sein könnte.
gut, ich schrieb das nuget-Paket und haben keine Absichten, die Sie nach unten, so dass anstatt wiederholen Sie den code (bitbucket.org/forloop/forloop-htmlhelpers/src) oder das wiki (bitbucket.org/forloop/forloop-htmlhelpers/wiki/Home) hier ein link dazu als Kommentar hält im Sinne von stackoverflow, IMO.
Hier ist eine andere Lösung, die scheint sehr nett: stackoverflow.com/questions/5355427/...
Sie sollten diese Frage beantworten. +1 das nuget-Paket löst das problem genauer OP ist.
NuGet-Paket ist keine Lösung, den code des Pakets sein könnte.
gut, ich schrieb das nuget-Paket und haben keine Absichten, die Sie nach unten, so dass anstatt wiederholen Sie den code (bitbucket.org/forloop/forloop-htmlhelpers/src) oder das wiki (bitbucket.org/forloop/forloop-htmlhelpers/wiki/Home) hier ein link dazu als Kommentar hält im Sinne von stackoverflow, IMO.
Hier ist eine andere Lösung, die scheint sehr nett: stackoverflow.com/questions/5355427/...
InformationsquelleAutor tugberk | 2011-09-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abschnitte gibt, die nicht in teilweise Ansichten und das ist auch so gewollt. Sie dürfen einige eigene Helfer zu erreichen ein ähnliches Verhalten, aber ehrlich, es ist die Sicht, die Verantwortung, die nötigen Skripte, nicht die partielle Verantwortung. Ich würde empfehlen die Verwendung des @ - Skripte Abschnitt von der Hauptansicht zu tun, und nicht die Teiltöne sorgen über Skripte.
Warum ist es gewollt?
Ich bin nicht einverstanden. Was ist mit der DRY-Prinzip? Ich mag es nicht, mich zu wiederholen, und wenn es auch nur script Referenzen.
jeder hat das Recht, seine Meinung zu äußern zu dem Thema. Ich respektiere Ihre. In meiner Antwort habe ich ausgedrückt mine und damit verbunden eine Antwort, die Ihnen erlauben würde, um diese Aufgabe. Aber ich habe auch hervorgehoben, was ich empfehlen würde, und für diese situation.
die Abstellung von @JoshNoe und der rest-ein "widget" (display + reichhaltige Interaktion) ist ein perfektes Beispiel für ein partielles eng gekoppelt an die zugehörigen javascript. entwerfen sollte ich das nicht schreiben müssen beiden include-Anweisungen in verschiedene Orte, um die volle Funktionalität, da das display wird nie ohne die Telefonzentrale Interaktion, und die Interaktion wird nie erscheinen an anderer Stelle.
InformationsquelleAutor Darin Dimitrov
Dies ist eine ziemlich beliebte Frage, also poste ich meine Lösung.
Ich hatte das gleiche problem und es ist zwar nicht optimal, aber ich denke, es funktioniert eigentlich ganz gut und macht nicht die teilweise abhängig von der Ansicht.
Mein Szenario war, dass eine Aktion war zugänglich durch sich selbst, sondern auch sein könnte, eingebettet in einen Blick - eine google-Karte.
In meinem
_layout
ich habe:In meinem
index
view habe ich:In meinem
clients
Ansicht habe ich (alle map-und assoc. html):Meine
Clients_Scripts
Ansicht enthält die javascript gerendert werden, die auf die SeiteDiese Weise mein Skript ist isoliert und dargestellt werden können, in die Seite, wo erforderlich, mit den
body_scripts
tag nur gerendert wird, auf das erste vorkommen, dass die razor view engine findet.Dass lässt mich alles getrennt - es ist eine Lösung, die funktioniert sehr gut für mich, andere haben vielleicht Probleme mit ihm, aber es funktioniert mit dem patch "by design" Loch.
20 andere Leute und ich haben eine andere Meinung. Sie können immer noch Skripte, die direkt mit einer Ansicht, die in einer separaten Datei, es ist ein Fehler bei der Programmierung, wenn Sie nicht fügen Sie Ihrem Skript zusammen mit Ihrem Blick. Wenn es in einer separaten Datei trennt zusammenspiel von Präsentation und ermöglicht eine fülle von anderen nutzen aus Sie es in einer separaten Datei.
Du hast vollkommen Recht. Ich eigentlich völlig einverstanden und bevorzugt diese Methode persönlich. Das eigentliche problem für mich ist, dass meine Kollegen mit diesem Kampf viel Trennung. Das ist ein domain-problem, obwohl. Ich denke, diese Methode ist ideal, vor allem, wenn Sie Faktor in einem JavaScript-build-Prozess. Ich werde weiterhin arbeiten auf die Erziehung meiner Kollegen mit dieser Methode, und ganz unterstützen. Ich denke, die Antwort könnte verbessert werden, obwohl. Sie brauchte nicht zu erwähnen, die "20 Leute Stimmen", obwohl. Nur weil eine Antwort ist beliebt, bedeutet nicht immer, dass es richtig ist. In diesem Fall ist es Recht.
Sehr wahr, und ich freue mich immer, zu akzeptieren konstruktives feedback und verändert meine eigenen code und Antwort, wenn es eine Verbesserung gewesen zu sein 🙂
Diese Lösung hat den zusätzlichen Vorteil, immer noch in der Lage alle MVC-ish Sachen, die Sie erwarten würden, um in der Lage zu tun, eine typische Anzeige, wie zum Beispiel die JSON-kodiert übergeben, Modell und generieren URLs mit Url.Aktion. Dieser Ansatz ist dann eine elegante Möglichkeit, um Ihre AngularJS-Controller - jeder Teil kann die Ansicht vertreten, ein separater controller in das Eckige-Modul. So sauber!
InformationsquelleAutor dan richardson
Aus den Lösungen in dieser thread, ich kam mit dem folgenden wahrscheinlich zu kompliziert Lösung, mit der Sie Verzögerung darstellen von html (scripts) in einem using-block.
NUTZUNG
Erstellen "Abschnitt"
Typisches Szenario: In einer Teilansicht, nur den block ein mal, egal wie viele Male die eingeschränkte Sicht ist wiederholt in die Seite:
In einer Teilansicht, gehören in den block für jedes mal, die teilweise verwendet wird:
In einer Teilansicht, wird nur der block einmal, egal wie viele Zeiten, die teilweise wiederholt, aber später machen es gezielt nach name
when-i-call-you
:Stellt die "Abschnitte"
(also der Darstellung der verzögerten Abschnitt in einem übergeordneten Ansicht)
CODE
du hast Recht-kommen hierher zurück, auch ich bin verwirrt, wie ich meinte, zu sagen, wie es zu benutzen. Aktualisierung der Antwort...
Und näher zu erläutern - den Grund gibt es zwei "Namen" ist, dass, wenn Sie es nur wollen gerendert, einmal braucht es den eindeutigen Schlüssel im parameter
isOnlyOne
, aber nur, wenn Sie wollen zu machen, es an einer bestimmten Stelle von name geben Sie den Bezeichner, sonst wird es weggeworfen aufHtml.RenderDelayed()
.Ich persönlich glaube nicht, dass gäbe es keine Notwendigkeit für den Kauf des ärger-und mit diesem Ansatz, der in Abschnitt teilweise den Blick einfach nicht benötigt, wie es beseitigt werden kann, und die scripts gehen können, dort ohne Definition einer Sektion. Es ist, weil extern gerendert und wenn man den code für die gerenderte Seite, die Sie einfach beachten Sie die code für die partielle view ist nicht sichtbar. Also wenn das die Frage der besseren Organisation, etc, haben keine Auswirkungen auf alle.
die "Debatte" hat bereits begonnen in den Kommentaren auf die akzeptierte Antwort stackoverflow.com/a/7556594/1037948
InformationsquelleAutor drzaus
Ich hatte dieses problem und verwendet diese Technik.
Seine die beste Lösung, die ich gefunden, die ist sehr flexibel.
Auch bitte Stimmen Sie hier hinzufügen von Unterstützung für die kumulative Abschnitt Erklärung
InformationsquelleAutor iBoy
Wenn Sie haben ein berechtigtes Bedürfnis, einige
js
aus einerpartial
, hier ist, wie Sie es tun könnte,jQuery
ist erforderlich:setTimeout(SeeIfReady, 100)
funktioniert auch, keine Notwendigkeit für eine implizite eval...Ich habe versucht @drzaus, braucht es das 'SeeIfReady" oder es funktioniert nicht.
InformationsquelleAutor Serj Sagan
Folgenden die unauffällig Prinzip, es ist nicht durchaus erforderlich, für "_myPartial" zu injizieren, Inhalte direkt in Skripts Abschnitt. Man könnte hinzufügen, diese partiellen view Skripts in separate
.js
- Datei und verweisen Sie den @ - Skripte Abschnitt aus der übergeordneten Ansicht.InformationsquelleAutor archil
Es ist ein grundlegender Fehler in der Art, wie wir denken über web, insbesondere bei der Verwendung von MVC. Der Fehler ist, dass JavaScript irgendwie die Ansicht in der Verantwortung. Eine Ansicht ist eine Ansicht, JavaScript - (Verhaltens-oder anderweitig), ist JavaScript. In Silverlight-und WPF-MVVM-Muster das wir sind konfrontiert mit dem "ersten Blick" oder "model first". Im MVC-wir sollten immer versuchen, auf Grund von dem Modell, den Standpunkt und JavaScript ist, ein Teil von diesem Modell in vielerlei Hinsicht.
Ich würde vorschlagen, mit der AMD Muster (ich selbst wie RequireJS). Separate JavaScript-Module, definieren Sie Ihre Funktionen und Haken in den html-von JavaScript anstelle des Bauens auf einen Blick, laden Sie die JavaScript. Dies wird bereinigen Sie Ihren code, können Sie Ihr Anliegen und machen das Leben einfacher alle auf einen Schlag.
JavaScript kann der Blick auf die Verantwortung als gut.
Mit dem AMD-Muster ist eine gute Idee, aber ich bin nicht einverstanden mit Ihrer Behauptung, JavaScript ist Teil des Modells. Oft ist es zu definieren, der Blick Verhalten, vor allem, wenn gepaart mit so etwas wie Knockout. Sie werfen eine JSON-Repräsentation des Modells in Ihren JavaScript Anzeigen. Persönlich, ich benutze nur Verschlüsse, die eine benutzerdefinierte "namespace" auf die
window
Objekt, und schließen Bibliothek von Skripts, bevor alle Teiltöne.InformationsquelleAutor Mr. Baudin
Die erste Lösung, die ich denken kann, ist die Verwendung ViewBag um die Werte zu speichern, die gemacht werden müssen.
Onestly ich nie versucht, wenn diese Arbeit aus einen seitlichen Ausblick, aber es sollte imo.
ViewBag.RenderScripts = new List<string>();
an der Spitze der Hauptseite, dann rief@Html.Partial("_CreateUpdatePartial",Model,ViewData)
, dann setzen@section Scripts {@foreach (string script in ViewBag.RenderScripts) Scripts.Render(script); }}
. In Teilansicht ich legte@{ViewBag.RenderScripts = ViewBag.RenderScripts ?? new List<string>();ViewBag.RenderScripts.Add("~/bundles/jquery");}
.InformationsquelleAutor Iridio
Sie können diese Erweiterung Methoden: (Speichern als PartialWithScript.cs)
Verwenden, wie diese:
Beispiel teilweise: (_MyPartial.cshtml)
Setzen Sie den html-Code in die if-und die js in die andere.
In Ihrem _Layout.cshtml, oder wo immer Sie wollen, dass die Skripte von der partials auf gerendert werden, setzen Sie die folgende (sobald): Es wird gerendert, nur das javascript von allen teiltönen, die auf der aktuellen Seite an dieser Stelle.
Dann zu verwenden, die partielle, machen Sie einfach Folgendes: Es Rendern wird nur das html an dieser Stelle.
InformationsquelleAutor Lomak
Können Sie nicht brauchen, mit Sektionen in der Teilansicht.
Gehören in der Teilansicht.
Es führen Sie die Funktion nach jQuery geladen wird.
Sie können dies ändern, de condition-Klausel für Ihren code.
Julio Spader
InformationsquelleAutor Julio Spader
Gibt es eine Möglichkeit zum einfügen von Abschnitten in teilweise Ansichten, obwohl es nicht hübsch ist. Sie müssen Zugriff auf zwei Variablen aus der übergeordneten Ansicht. Da ein Teil Ihrer Teilansicht der Zweck ist, die zum erstellen dieser Abschnitt macht es Sinn, zu verlangen, diese Variablen.
Hier ist, was es aussieht wie, um einen Abschnitt einfügen, in der Teilansicht:
Und in die Seite einfügen der Teilansicht...
Sie können dieses Verfahren auch verwenden, um zu definieren, den Inhalt eines Abschnitts programmgesteuert in jeder Klasse.
Genießen!
InformationsquelleAutor Pluto
Dieser arbeitete für mich, die mir erlaubt, zu co-lokalisieren, javascript und html für eine teilweise Ansicht in der gleichen Datei. Hilft bei der Denkprozess, um zu sehen, html-und zugehörige Teil in die gleiche Teilansicht Datei.
In Sicht, die verwendet Teilweise Ansicht mit dem Namen "_MyPartialView.cshtml"
In Teilansicht Datei
InformationsquelleAutor purvin
Ziel der OP ist, dass er will, um zu definieren, inline-Skripte in seine eingeschränkte Sicht, was ich davon ausgehen, dass dieses Skript ist ausschließlich für diesen Teil die Sicht, und der block in seiner Skript-Abschnitt.
Ich bekommen, die er haben will, die Teilweise Sicht auf sich selbst enthalten. Die Idee ist ähnlich Komponenten bei der Verwendung von Angular.
Mein Weg wäre, nur halten Sie die Skripte in der Teilansicht. Nun das problem ist beim aufrufen Teilansicht, kann das Skript ausführen, in der es vor allen anderen scripts (die in der Regel Hinzugefügt, um den unteren Rand der layout-Seite). In diesem Fall, Sie müssen nur die Partiellen View Skript warten, bis die anderen scripts. Es gibt mehrere Möglichkeiten, dies zu tun. Die einfachste, die ich verwendet habe, vor, eine Veranstaltung auf
body
.Auf meinem layout, ich würde etwas auf den Boden wie diesem:
Dann auf meine Teilansicht (unten):
Andere Lösung ist die Verwendung eines stack zu schieben Sie alle Ihre Skripts und rufen Sie jeweils am Ende. Andere Lösung, wie bereits erwähnt, ist RequireJS/AMD-Muster, das funktioniert wirklich gut, auch.
InformationsquelleAutor alans
Ich löste dies eine völlig andere route (weil ich war in Eile und wollte nicht zu der Einführung einer neuen HtmlHelper):
Wickelte ich meine Teilweise mit Blick in eine große if-else-Anweisung:
Dann rief ich die Teilweise zweimal mit einem benutzerdefinierten ViewData:
@Html.Partial("MyPartialViewScripts")
Nein, die Idee ist es, die Skripte definiert werden, die im selben Dokument als html, aber ich Stimme, dass dies nicht ideal ist.
InformationsquelleAutor Rick Love
Ich hatte ein ähnliches problem, wo ich eine master-Seite wie folgt:
aber den seitlichen Blick hing auf einige JavaScript im Script-Abschnitt. Ich löste es, indem die Codierung der partiellen view als JSON, lade diese in eine JavaScript-variable und dann mit diesem zu füllen, ein div, also:
InformationsquelleAutor John M
choicely, können Sie Ihre Folder/index.cshtml als masterpage dann fügen Sie im Abschnitt Skripte. Dann, in Ihrem layout, die Sie haben:
und Ihr index.cshtml:
und es wird die Arbeit über alle Ihre partialviews. Es funktioniert für mich
InformationsquelleAutor RogerEdward
Pluto Idee in ein schöner Weg:
CustomWebViewPage.cs:
Views\web.config:
Anzeigen:
Teilweise (_BackendSearchForm.cshtml):
Layout-Seite:
InformationsquelleAutor PaulSanS
Mithilfe von Mvc-Kern können Sie erstellen, die eine ordentliche TagHelper
scripts
wie unten zu sehen ist. Dies könnte leicht sein, verwandelte sich in einesection
tag, wo Sie ihm einen Namen geben, wie gut (oder wie der name ist entnommen aus dem abgeleiteten Typ). Beachten Sie, dass dependency injection eingerichtet werden muss fürIHttpContextAccessor
.Beim hinzufügen von Skripten (z.B. in einem Teil -)
, Wenn die Ausgabe des scripts (z.B. in einer layout-Datei)
Code
InformationsquelleAutor BlackjacketMack
Gut, ich denke, die anderen Poster haben Sie ein Mittel, um direkt ein @ - Abschnitt in Ihrem teilweise (durch die Verwendung von 3rd-party-html-Helfer).
Aber ich rechne damit, dass, wenn Ihr Skript ist eng gekoppelt an die partielle, legen Sie einfach Ihren javascript direkt innerhalb einer inline -
<script>
tag innerhalb Ihrer Teil-und mit ihm getan werden (nur vorsichtig sein, von Skript Vervielfältigung, wenn Sie beabsichtigen, mit den teilweise mehr als einmal in einer einzigen Ansicht);InformationsquelleAutor CShark
Ich habe gerade diesen code auf meine eingeschränkte Sicht und das problem gelöst, wenn auch nicht sehr sauber, es funktioniert. Sie müssen sicherstellen, dass die die Ids von den Objekten, die Sie Rendern.
$(document).bereit(Funktion () {
$("#Profile_ProfileID").selectmenu({ icons: { button: 'ui-icon-circle-arrow-s' } });
$("#TitleID_FK").selectmenu({ icons: { button: 'ui-icon-circle-arrow-s' } });
$("#CityID_FK").selectmenu({ icons: { button: 'ui-icon-circle-arrow-s' } });
$("#GenderID_FK").selectmenu({ icons: { button: 'ui-icon-circle-arrow-s' } });
$("#PackageID_FK").selectmenu({ icons: { button: 'ui-icon-circle-arrow-s' } });
});
InformationsquelleAutor luis
davon aus, dass Sie eine teilweise Ansicht mit dem Namen " _contact.cshtml, Ihr Kontakt kann eine juristische (name) oder einen physischen Gegenstand (Vorname, Nachname). Ihre Ansicht sollte man aufpassen was dargestellt werden kann und dass dies mit javascript. so verzögerte rendering-und JS in der Ansicht kann erforderlich sein.
die einzige Art, wie ich denke, wie kann es entfallen, wenn wir es schaffen eine unaufdringliche Art und Weise im Umgang mit der Benutzeroberfläche betrifft.
beachten Sie auch, dass MVC 6 eine sogenannte View-Komponente, auch MVC futures hatten einige ähnliche Sachen und Telerik unterstützt auch so eine Sache...
InformationsquelleAutor user4298890
Ich hatte das ähnliche problem gelöst es mit diesem:
Das ist eine hübsche Art und Weise zu injizieren, ich guesse.
InformationsquelleAutor Pouria Jafari