À l'aide de Rasoir dans JavaScript
Est-il possible ou est-il une solution pour utiliser la syntaxe Razor dans le JavaScript qui est en vue (cshtml
)?
Je suis en train d'ajouter des marqueurs à une carte Google map... Par exemple, j'ai essayé ceci, 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>
- Quelle est l'erreur que vous obtenez?
- vous pouvez être intéressé par ma mise à jour concernant
@:
de la syntaxe. - considérant le faisant de cette façon, à moins de mettre les données dans une autre balise de script qui définit tout simplement quelques JSON qui est ensuite utilisé dans le JS. Back-end couplé à la JS sur le front-end a été un héritage PITA pour moi sur un certain nombre de reprises. Ne pas écrire du code avec le code si vous n'avez pas à. Main de données.
Vous devez vous connecter pour publier un commentaire.
Utiliser le
<text>
pseudo-élément, comme décrit ici, à force de le Rasoir compilateur de retour en mode de contenu:Mise à jour:
Scott Guthrie a récemment posté sur
@:
syntaxe de Rasoir, ce qui est un peu moins maladroit que la<text>
tag si vous avez juste une ou deux lignes de code JavaScript à ajouter. L'approche suivante serait probablement préférable, car elle réduit la taille du fichier HTML généré. (Vous pouvez même déplacer le addMarker fonction statique, la mise en cache des fichiers JavaScript pour réduire davantage la taille):Mis à jour le code ci-dessus pour faire l'appel à
addMarker
plus correct.De préciser, les
@:
forces de Rasoir de retour en mode texte, même siaddMarker
appel ressemble beaucoup à du code C#. Rasoir ramasse alors la@item.Property
syntaxe-à-dire qu'il devrait directement en sortie le contenu de ces propriétés.Mise à jour 2
Il est intéressant de noter que Afficher le code n'est vraiment pas un bon endroit pour mettre du code JavaScript. Le code JavaScript doit être placé dans un statique
.js
fichier, et ensuite, il doit obtenir les données dont elle a besoin, soit à partir d'un appel Ajax ou par la numérisationdata-
attributs de HTML. En plus de rendre possible pour le cache de votre code JavaScript, cela permet aussi d'éviter des problèmes avec l'encodage, depuis Rasoir est conçu pour encoder au format HTML, mais pas JavaScript.Afficher Le Code
Code JavaScript
@Model.Latitude
. Il devrait probablement être@item.Latitude
, donc je vais changer cela dans la réponse. Mais le point principal est que le@:
syntaxe indique Rasoir à considérer que la ligne de texte même si par Razor règles normales, il serait rester dans le "code" de mode.@item.Title
contient un guillemet simple, ce code va exploser.data-
attributs, et ensuite utiliser statique, javascript discret pour glaner ces informations à partir de la DOM. Mais toute cette discussion était en quelque sorte au-delà de la portée de la question.<text>
balise lorsque cela est nécessaire. Le point de la deuxième partie est qu'il est généralement une bonne idée de regrouper plusieurs lignes en un seul appel de méthode. Honnêtement, je n'ai même pas écrire inline code javascript personnellement--je trouve que javascript discret techniques qui fonctionnent le mieux. Le Javascript peut résider dans les fichiers javascript et le DOM est utilisé pour communiquer leurs intentions.HTML.Raw(Server.JavaScriptStringEncode(...)
)Je viens d'écrire cette fonction d'assistance. Mettre dans
App_Code/JS.cshtml
:Puis dans votre exemple, vous pouvez faire quelque chose comme ceci:
Remarquez comment je ne mets pas de guillemets autour de lui. Si le titre contient déjà des citations, il ne sera pas exploser. Semble gérer des dictionnaires et des objets anonymes bien aussi!
@Html.Raw(Json.Encode(Model))
Vous essayez de confiture d'une cheville carrée dans un trou rond.
De rasoir a été conçu comme une génération de HTML langage de template. Vous pouvez très bien obtenir de générer un code JavaScript, mais il n'a pas été conçu pour cela.
Par exemple: Que faire si
Model.Title
contient une apostrophe? Que serait briser votre code JavaScript, et le Rasoir ne pourrons pas échapper correctement par défaut.Il serait probablement plus approprié d'utiliser une Chaîne de générateur dans une fonction d'assistance. Il y aura probablement moins de conséquences inattendues de cette approche.
Quelles erreurs avez-vous observé?
Quelque chose comme cela pourrait fonctionner mieux:
Noter que vous avez besoin de la magie
<text>
tag après leforeach
pour indiquer que le Rasoir doit passer en mode de balisage.Qui fonctionnera très bien, tant que c'est dans un CSHTML page et pas un fichier JavaScript externe.
Le Rasoir modèle de moteur ne se soucie pas ce que c'est de la sortie et ne fait pas de distinction entre
<script>
ou d'autres balises.Cependant, vous devez encoder vos chaînes pour empêcher XSS attaques.
HTML.Raw(Server.JavaScriptStringEncode(...))
HTML.Raw(HttpUtility.JavaScriptStringEncode(...))
- Serveur de la propriété n'a pas cette méthode maintenant. HttpUtility ne.The Razor template engine doesn't care what it's outputting and does not differentiate between <script> or other tags.
Êtes-vous sûr aobut qui? stackoverflow.com/questions/33666065/...Je préfère "<!--" "-->" comme un texte ">"
Une chose à ajouter, j'ai trouvé que la syntaxe Razor hilighter (et probablement le compilateur) interpréter la position de l'ouverture du support de manière différente:
Un simple et un bon straight-forward exemple:
Cela crée un script dans votre page à l'emplacement que vous placez le code ci-dessus qui se présente comme suit:
Maintenant, vous avez un JavaScript global variable nommée
razorUserName
à laquelle vous pouvez accéder et l'utiliser sur le client. Le moteur de Rasoir a évidemment extrait la valeur de@User.Identity.Name
(côté serveur variable) et le mettre dans le code qu'il écrit dans votre balise de script.La solution suivante me paraît plus juste que de combiner JavaScript avec un Rasoir. Check this out:
https://github.com/brooklynDev/NGon
Vous pouvez ajouter presque n'importe quel complexe de données à ViewBag.Ngon et y accéder dans JavaScript
Dans le contrôleur:
En JavaScript:
Il permet à tout plain old CLR objets (Poco) qui peut être sérialisée en utilisant la valeur par défaut
JavascriptSerializer
.Il y a aussi une option de plus que @: et
<text></text>
.À l'aide de
<script>
bloc lui-même.Lorsque vous avez besoin de faire de gros morceaux de JavaScript en fonction de Rasoir code, vous pouvez le faire comme ceci:
Pros de cette manière, c'est qu'il ne se mélange pas le JavaScript et le Rasoir trop, parce que le mélange d'un grand nombre va provoquer la lisibilité des problèmes par la suite. Aussi de gros blocs de texte ne sont pas très lisible non plus.
Aucune de ces solutions ne fonctionne correctement... j'ai essayé toutes les façons, mais il ne me donne pas le résultat attendu... enfin j'ai trouvé qu'il y a quelques erreurs dans le code... Et le plein de code est donné ci-dessous.
J'ai enfin trouvé la solution (*.vbhtml):