Ist es möglich oder gibt es eine Problemumgehung, um die Razor-Syntax in JavaScript zu verwenden, das sich in einer Ansicht befindet (cshtml
)?
Ich versuche, einer Google-Karte Markierungen hinzuzufügen ... Ich habe dies beispielsweise versucht, erhalte jedoch eine Menge Kompilierungsfehler:
<script type="text/javascript">
// Some JavaScript code here to display map, etc.
// Now add markers
@foreach (var item in Model) {
var markerlatLng = new google.maps.LatLng(@(Model.Latitude), @(Model.Longitude));
var title = '@(Model.Title)';
var description = '@(Model.Description)';
var contentString = '<h3>' + title + '</h3>' + '<p>' + description + '</p>'
var infowindow = new google.maps.InfoWindow({
content: contentString
});
var marker = new google.maps.Marker({
position: latLng,
title: title,
map: map,
draggable: false
});
google.maps.event.addListener(marker, 'click', function () {
infowindow.open(map, marker);
});
}
</script>
javascript
asp.net-mvc
razor
Raklos
quelle
quelle
@:
Syntax.Antworten:
Verwenden Sie das hier
<text>
beschriebene Pseudoelement , um den Razor-Compiler wieder in den Inhaltsmodus zu versetzen:Aktualisieren:
Scott Guthrie hat kürzlich über die
@:
Syntax in Razor geschrieben, die etwas weniger klobig ist als das<text>
Tag, wenn Sie nur ein oder zwei Zeilen JavaScript-Code hinzufügen müssen. Der folgende Ansatz wäre wahrscheinlich vorzuziehen, da er die Größe des generierten HTML-Codes verringert. (Sie können die Funktion addMarker sogar in eine statische, zwischengespeicherte JavaScript-Datei verschieben, um die Größe weiter zu verringern.)Der obige Code wurde aktualisiert, um den Aufruf
addMarker
korrekter zu gestalten.Zur Verdeutlichung
@:
zwingt Razor den Textmodus zurück, obwohl deraddMarker
Aufruf dem C # -Code sehr ähnlich sieht. Razor greift dann auf die@item.Property
Syntax zurück, um zu sagen, dass der Inhalt dieser Eigenschaften direkt ausgegeben werden soll.Update 2
Es ist erwähnenswert, dass View-Code wirklich kein guter Ort ist, um JavaScript-Code einzufügen. JavaScript-Code sollte in eine statische
.js
Datei eingefügt werden und dann die benötigten Daten entweder aus einem Ajax-Aufruf oder durch Scannen abrufendata-
Attributen aus dem HTML- . Dies ermöglicht nicht nur das Zwischenspeichern Ihres JavaScript-Codes, sondern vermeidet auch Probleme mit der Codierung, da Razor für die Codierung von HTML, nicht jedoch von JavaScript ausgelegt ist.Code anzeigen
JavaScript-Code
quelle
@item.Title
ein einfaches Anführungszeichen enthalten ist, explodiert dieser Code.data-
Attributen, und dann statisch, unaufdringliche Javascript verwenden diese Informationen aus dem DOM aufzulesen. Aber diese ganze Diskussion ging irgendwie über den Rahmen der Frage hinaus.Ich habe gerade diese Hilfsfunktion geschrieben. Setzen Sie es ein
App_Code/JS.cshtml
:In Ihrem Beispiel können Sie dann Folgendes tun:
Beachten Sie, dass ich keine Anführungszeichen darum setze. Wenn der Titel bereits Anführungszeichen enthält, wird er nicht explodieren. Scheint auch gut mit Wörterbüchern und anonymen Objekten umzugehen!
quelle
@Html.Raw(Json.Encode(Model))
Sie versuchen, einen quadratischen Stift in ein rundes Loch zu stecken.
Razor war als HTML-generierende Vorlagensprache gedacht. Sie können es sehr gut dazu bringen, JavaScript-Code zu generieren, aber es wurde nicht dafür entwickelt.
Zum Beispiel: Was wäre wenn
Model.Title
ein Apostroph enthalten ist? Das würde Ihren JavaScript-Code beschädigen und Razor wird ihn standardmäßig nicht korrekt umgehen.Es wäre wahrscheinlich besser, einen String-Generator in einer Hilfsfunktion zu verwenden. Dieser Ansatz wird wahrscheinlich weniger unbeabsichtigte Folgen haben.
quelle
Welche spezifischen Fehler sehen Sie?
So etwas könnte besser funktionieren:
Beachten Sie, dass Sie das magische
<text>
Tag nach dem benötigen,foreach
um anzuzeigen, dass Razor in den Markup-Modus wechseln soll.quelle
Das wird gut funktionieren, solange es sich auf einer CSHTML-Seite und nicht in einer externen JavaScript-Datei befindet.
Die Razor Template Engine kümmert sich nicht um die Ausgabe und unterscheidet nicht zwischen
<script>
oder anderen Tags.Sie müssen jedoch Ihre Zeichenfolgen codieren, um XSS- Angriffe zu verhindern .
quelle
HTML.Raw(Server.JavaScriptStringEncode(...))
HTML.Raw(HttpUtility.JavaScriptStringEncode(...))
- Die Servereigenschaft hat diese Methode jetzt nicht. HttpUtility tut es.The Razor template engine doesn't care what it's outputting and does not differentiate between <script> or other tags.
Bist du dir darüber sicher? stackoverflow.com/questions/33666065/…Ich bevorzuge "<! -" "->" wie ein "Text>"
quelle
@:
<text>
Eine Sache hinzuzufügen - ich fand, dass Razor Syntax Hilighter (und wahrscheinlich der Compiler) die Position der öffnenden Klammer unterschiedlich interpretieren:
quelle
Ein einfaches und gutes Beispiel:
Dadurch wird ein Skript auf Ihrer Seite an der Stelle erstellt, an der Sie den Code platzieren, der wie folgt aussieht:
Jetzt haben Sie eine globale JavaScript-Variable mit dem Namen, auf
razorUserName
die Sie zugreifen und die Sie auf dem Client verwenden können. Die Razor-Engine hat den Wert offensichtlich aus@User.Identity.Name
(serverseitige Variable) extrahiert und in den Code eingefügt, den sie in Ihr Skript-Tag schreibt.quelle
Die folgende Lösung scheint mir genauer zu sein, als JavaScript mit Razor zu kombinieren. Überprüfen Sie dies: https://github.com/brooklynDev/NGon
Sie können ViewBag.Ngon fast alle komplexen Daten hinzufügen und in JavaScript darauf zugreifen
In der Steuerung:
In JavaScript:
Es erlaubt alle einfachen alten CLR-Objekte (POCOs), die mit der Standardeinstellung serialisiert werden können
JavascriptSerializer
.quelle
Es gibt auch eine Option mehr als @: und
<text></text>
.Mit
<script>
Block selbst.Wenn Sie abhängig vom Razor-Code große Teile von JavaScript ausführen müssen, können Sie dies folgendermaßen tun:
Vorteile dieser Art sind, dass JavaScript und Razor nicht zu stark gemischt werden, da ein häufiges Mischen letztendlich zu Problemen mit der Lesbarkeit führt. Auch große Textblöcke sind nicht sehr gut lesbar.
quelle
Keine der vorherigen Lösungen funktioniert korrekt ... Ich habe alle Möglichkeiten ausprobiert, aber es hat mir nicht das erwartete Ergebnis gebracht ... Endlich habe ich festgestellt, dass der Code einige Fehler enthält ... Und der vollständige Code ist angegeben unten.
quelle
Ich habe endlich die Lösung gefunden (* .vbhtml):
quelle