¿Es posible o hay una solución alternativa para usar la sintaxis Razor dentro de JavaScript que está en una vista ( cshtml
)?
Estoy intentando agregar marcadores a un mapa de Google ... Por ejemplo, intenté esto, pero recibo un montón de errores de compilación:
<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
fuente
fuente
@:
sintaxis.Respuestas:
Utilice el
<text>
pseudo-elemento, como se describe aquí , para forzar al compilador Razor a volver al modo de contenido:Actualizar:
Scott Guthrie publicó recientemente sobre la
@:
sintaxis en Razor, que es un poco menos torpe que la<text>
etiqueta si solo tiene que agregar una o dos líneas de código JavaScript. El siguiente enfoque probablemente sería preferible, ya que reduce el tamaño del HTML generado. (Incluso podría mover la función addMarker a un archivo JavaScript estático en caché para reducir aún más el tamaño):Se actualizó el código anterior para que la llamada sea
addMarker
más correcta.Para aclarar, las
@:
fuerzas de Razor vuelven al modo de texto, a pesar de que laaddMarker
llamada se parece mucho al código C #. Razor luego recoge la@item.Property
sintaxis para decir que debería generar directamente el contenido de esas propiedades.Actualización 2
Vale la pena señalar que Ver código realmente no es un buen lugar para poner código JavaScript. El código JavaScript debe colocarse en un
.js
archivo estático , y luego debe obtener los datos que necesita, ya sea de una llamada Ajax o escaneandodata-
atributos del HTML. Además de hacer posible almacenar en caché su código JavaScript, esto también evita problemas con la codificación, ya que Razor está diseñado para codificar HTML, pero no JavaScript.Ver código
Código JavaScript
fuente
@item.Title
contiene una comilla simple, este código explotará.data-
atributos, y luego usar estática, Javascript discreta para recopilar esta información de la DOM. Pero toda esa discusión estaba más allá del alcance de la pregunta.Acabo de escribir esta función auxiliar. Ponlo en
App_Code/JS.cshtml
:Luego, en su ejemplo, puede hacer algo como esto:
Observe cómo no pongo citas a su alrededor. Si el título ya contiene comillas, no explotará. ¡Parece manejar bien los diccionarios y los objetos anónimos también!
fuente
@Html.Raw(Json.Encode(Model))
Estás intentando atascar una clavija cuadrada en un agujero redondo.
Razor fue pensado como un lenguaje de plantilla generadora de HTML. Es muy posible que genere código JavaScript, pero no fue diseñado para eso.
Por ejemplo: ¿Qué pasa si
Model.Title
contiene un apóstrofe? Eso rompería su código JavaScript, y Razor no lo escapará correctamente de forma predeterminada.Probablemente sería más apropiado usar un generador de cadenas en una función auxiliar. Probablemente habrá menos consecuencias no deseadas de ese enfoque.
fuente
¿Qué errores específicos estás viendo?
Algo como esto podría funcionar mejor:
Tenga en cuenta que necesita la
<text>
etiqueta mágica después de laforeach
para indicar que Razor debe cambiar al modo de marcado.fuente
Eso funcionará bien, siempre que esté en una página CSHTML y no en un archivo JavaScript externo.
El motor de plantillas Razor no le importa lo que está generando y no diferencia entre
<script>
otras etiquetas.Sin embargo, debe codificar sus cadenas para evitar ataques XSS .
fuente
HTML.Raw(Server.JavaScriptStringEncode(...))
HTML.Raw(HttpUtility.JavaScriptStringEncode(...))
- La propiedad del servidor no tiene este método ahora. HttpUtility hace.The Razor template engine doesn't care what it's outputting and does not differentiate between <script> or other tags.
¿Estás seguro de eso? stackoverflow.com/questions/33666065/…Prefiero "<! -" "->" como un "texto>"
fuente
@:
y<text>
Una cosa para agregar: descubrí que Razor sintaxis hilighter (y probablemente el compilador) interpretan la posición del paréntesis de apertura de manera diferente:
fuente
Un ejemplo simple y bueno:
Esto crea una secuencia de comandos en su página en la ubicación donde coloca el código de arriba que se parece a lo siguiente:
Ahora tiene una variable global de JavaScript denominada a la
razorUserName
que puede acceder y usar en el cliente. El motor Razor obviamente ha extraído el valor de@User.Identity.Name
(variable del lado del servidor) y lo ha colocado en el código que escribe en su etiqueta de script.fuente
La siguiente solución me parece más precisa que combinar JavaScript con Razor. Mira esto: https://github.com/brooklynDev/NGon
Puede agregar casi cualquier dato complejo a ViewBag.Ngon y acceder a él en JavaScript
En el controlador:
En JavaScript:
Permite cualquier objeto CLR antiguo (POCO) que se pueda serializar utilizando el valor predeterminado
JavascriptSerializer
.fuente
También hay una opción más que @: y
<text></text>
.Usando el
<script>
bloque en sí.Cuando necesite hacer grandes porciones de JavaScript dependiendo del código de Razor, puede hacerlo así:
Las ventajas de esta manera es que no mezcla JavaScript y Razor demasiado, porque mezclarlos mucho causará problemas de legibilidad eventualmente. Además, los bloques de texto grandes tampoco son muy legibles.
fuente
Ninguna de las soluciones anteriores funciona correctamente ... He intentado todas las formas, pero no me dio el resultado esperado ... Finalmente encontré que hay algunos errores en el código ... Y se proporciona el código completo abajo.
fuente
Finalmente encontré la solución (* .vbhtml):
fuente