Est-il possible ou existe-t-il une solution de contournement pour utiliser la syntaxe Razor dans JavaScript qui est dans une vue ( cshtml
)?
J'essaie d'ajouter des marqueurs à une carte Google ... Par exemple, j'ai essayé cela, mais je reçois une tonne d'erreurs de compilation:
<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
la source
la source
@:
syntaxe.Réponses:
Utilisez le
<text>
pseudo-élément, comme décrit ici , pour forcer le compilateur Razor à revenir en mode contenu:Mise à jour:
Scott Guthrie a récemment publié un article sur la
@:
syntaxe dans Razor, qui est légèrement moins maladroite que la<text>
balise si vous n'avez qu'une ou deux lignes de code JavaScript à ajouter. L'approche suivante serait probablement préférable, car elle réduit la taille du code HTML généré. (Vous pouvez même déplacer la fonction addMarker vers un fichier JavaScript statique et mis en cache pour réduire davantage la taille):Mise à jour du code ci-dessus pour rendre l'appel
addMarker
plus correct.Pour clarifier, le
@:
Razor force à revenir en mode texte, même si l'addMarker
appel ressemble beaucoup au code C #. Razor récupère ensuite la@item.Property
syntaxe pour dire qu'il doit sortir directement le contenu de ces propriétés.Update 2
Il convient de noter que le code View n'est vraiment pas un bon endroit pour mettre du code JavaScript. Le code JavaScript doit être placé dans un
.js
fichier statique , puis il doit obtenir les données dont il a besoin soit à partir d'un appel Ajax ou en scannant lesdata-
attributs à partir du HTML. En plus de permettre de mettre en cache votre code JavaScript, cela évite également les problèmes d'encodage, car Razor est conçu pour encoder en HTML, mais pas en JavaScript.Afficher le code
Code JavaScript
la source
@item.Title
contient une seule citation, ce code explosera.data-
attributs, puis utilisez statique, javascript discret pour glaner ces informations du DOM. Mais toute cette discussion dépassait en quelque sorte la portée de la question.Je viens d'écrire cette fonction d'aide. Mettez-le dans
App_Code/JS.cshtml
:Ensuite, dans votre exemple, vous pouvez faire quelque chose comme ceci:
Remarquez comment je ne mets pas de guillemets autour. Si le titre contient déjà des guillemets, il n'explosera pas. Semble bien gérer les dictionnaires et les objets anonymes!
la source
@Html.Raw(Json.Encode(Model))
Vous essayez de coincer une cheville carrée dans un trou rond.
Razor était conçu comme un langage de modèle générant du HTML. Vous pouvez très bien le faire générer du code JavaScript, mais il n'a pas été conçu pour cela.
Par exemple: que faire si
Model.Title
contient une apostrophe? Cela casserait votre code JavaScript et Razor ne l'échapperait pas correctement par défaut.Il serait probablement plus approprié d'utiliser un générateur de chaînes dans une fonction d'assistance. Il y aura probablement moins de conséquences imprévues de cette approche.
la source
Quelles erreurs spécifiques voyez-vous?
Quelque chose comme ça pourrait mieux fonctionner:
Notez que vous avez besoin de la
<text>
balise magique après leforeach
pour indiquer que Razor doit passer en mode de balisage.la source
Cela fonctionnera bien, tant qu'il se trouve dans une page CSHTML et non dans un fichier JavaScript externe.
Le moteur de modèle Razor ne se soucie pas de ce qu'il génère et ne fait pas de différence entre
<script>
ou d'autres balises.Cependant, vous devez encoder vos chaînes pour empêcher les attaques XSS .
la source
HTML.Raw(Server.JavaScriptStringEncode(...))
HTML.Raw(HttpUtility.JavaScriptStringEncode(...))
- La propriété du serveur n'a plus cette méthode maintenant. HttpUtility le fait.The Razor template engine doesn't care what it's outputting and does not differentiate between <script> or other tags.
Êtes-vous sûr de cela? stackoverflow.com/questions/33666065/…Je préfère "<! -" "->" comme un "texte>"
la source
@:
et<text>
Une chose à ajouter - j'ai trouvé que la syntaxe Razor hilighter (et probablement le compilateur) interprétait différemment la position du support d'ouverture:
la source
Un exemple simple et bon:
Cela crée un script dans votre page à l'emplacement où vous placez le code ci-dessus qui ressemble à ceci:
Vous avez maintenant une variable JavaScript globale nommée à
razorUserName
laquelle vous pouvez accéder et utiliser sur le client. Le moteur Razor a évidemment extrait la valeur de@User.Identity.Name
(variable côté serveur) et l'a mise dans le code qu'il écrit dans votre balise de script.la source
La solution suivante me semble plus précise que de combiner JavaScript avec Razor. Vérifiez ceci: https://github.com/brooklynDev/NGon
Vous pouvez ajouter presque toutes les données complexes à ViewBag.Ngon et y accéder en JavaScript
Dans le contrôleur:
En JavaScript:
Il autorise tous les anciens objets CLR (POCO) simples qui peuvent être sérialisés en utilisant la valeur par défaut
JavascriptSerializer
.la source
Il existe également une option de plus que @: et
<text></text>
.Utiliser le
<script>
bloc lui-même.Lorsque vous devez faire de gros morceaux de JavaScript en fonction du code Razor, vous pouvez le faire comme ceci:
Les avantages de cette manière est qu'il ne mélange pas trop JavaScript et Razor, car les mélanger beaucoup entraînera éventuellement des problèmes de lisibilité. Les gros blocs de texte ne sont pas non plus très lisibles.
la source
Aucune des solutions précédentes ne fonctionne correctement ... J'ai essayé de toutes les manières, mais cela ne m'a pas donné le résultat attendu ... Enfin j'ai trouvé qu'il y a quelques erreurs dans le code ... Et le code complet est donné au dessous de.
la source
J'ai finalement trouvé la solution (* .vbhtml):
la source