É possível ou existe uma solução alternativa para usar a sintaxe Razor no JavaScript que está em uma view ( cshtml
)?
Estou tentando adicionar marcadores a um mapa do Google ... Por exemplo, tentei isso, mas estou recebendo muitos erros de compilação:
<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
fonte
fonte
@:
sintaxe.Respostas:
Use o
<text>
pseudo-elemento, conforme descrito aqui , para forçar o compilador Razor de volta ao modo de conteúdo:Atualizar:
Scott Guthrie postou recentemente sobre a
@:
sintaxe no Razor, que é um pouco menos desajeitada que a<text>
tag, se você tiver apenas uma ou duas linhas de código JavaScript para adicionar. A abordagem a seguir provavelmente seria preferível, porque reduz o tamanho do HTML gerado. (Você pode até mover a função addMarker para um arquivo JavaScript estático em cache para reduzir ainda mais o tamanho):Atualizado o código acima para tornar a chamada
addMarker
mais correta.Para esclarecer, as
@:
forças Razor voltam ao modo de texto, mesmo que aaddMarker
chamada pareça muito com o código C #. O Razor pega a@item.Property
sintaxe para dizer que deve exibir diretamente o conteúdo dessas propriedades.Atualização 2
Vale a pena notar que o código View realmente não é um bom lugar para colocar código JavaScript. O código JavaScript deve ser colocado em um
.js
arquivo estático e, em seguida, ele deve obter os dados necessários a partir de uma chamada Ajax ou varrendodata-
atributos do HTML. Além de tornar possível o cache do seu código JavaScript, isso também evita problemas com a codificação, já que o Razor foi projetado para codificar para HTML, mas não para JavaScript.Ver Código
Código JavaScript
fonte
@item.Title
contiver uma citação única, esse código explodirá.data-
atributos e, em seguida, usar javascript estático e discreto para coletar essas informações do DOM. Mas toda essa discussão estava além do escopo da questão.Acabei de escrever esta função auxiliar. Coloque-o em
App_Code/JS.cshtml
:Então, no seu exemplo, você pode fazer algo assim:
Observe como não coloco aspas. Se o título já contiver aspas, ele não explodirá. Parece lidar com dicionários e objetos anônimos também!
fonte
@Html.Raw(Json.Encode(Model))
Você está tentando enfiar uma estaca quadrada em um buraco redondo.
O Razor foi concebido como uma linguagem de modelo geradora de HTML. Você pode muito bem conseguir gerar código JavaScript, mas não foi projetado para isso.
Por exemplo: E se
Model.Title
contiver um apóstrofo? Isso quebraria o código JavaScript e o Razor não escapará corretamente por padrão.Provavelmente seria mais apropriado usar um gerador de String em uma função auxiliar. Provavelmente haverá menos consequências não intencionais dessa abordagem.
fonte
Quais erros específicos você está vendo?
Algo assim poderia funcionar melhor:
Observe que você precisa da
<text>
tag mágica após aforeach
para indicar que o Razor deve mudar para o modo de marcação.fonte
Isso funcionará bem, desde que esteja em uma página CSHTML e não em um arquivo JavaScript externo.
O mecanismo de modelo do Razor não se importa com o que está sendo produzido e não diferencia entre
<script>
ou outras tags.No entanto, você precisa codificar suas seqüências para evitar ataques XSS .
fonte
HTML.Raw(Server.JavaScriptStringEncode(...))
HTML.Raw(HttpUtility.JavaScriptStringEncode(...))
- A propriedade do servidor não possui esse método agora. HttpUtility faz.The Razor template engine doesn't care what it's outputting and does not differentiate between <script> or other tags.
Você tem certeza disso? stackoverflow.com/questions/33666065/…Eu prefiro "<! -" "->" como um "texto>"
fonte
@:
e<text>
Uma coisa a acrescentar - descobri que a sintaxe do Razor hilighter (e provavelmente o compilador) interpreta a posição do suporte de abertura de maneira diferente:
fonte
Um exemplo simples e direto:
Isso cria um script em sua página no local em que você coloca o código acima, que se parece com o seguinte:
Agora você tem uma variável JavaScript global denominada, a
razorUserName
qual pode acessar e usar no cliente. O mecanismo Razor obviamente extraiu o valor de@User.Identity.Name
(variável do lado do servidor) e o colocou no código que escreve na sua tag de script.fonte
A solução a seguir me parece mais precisa do que combinar o JavaScript com o Razor. Verifique isso: https://github.com/brooklynDev/NGon
Você pode adicionar quase todos os dados complexos ao ViewBag.Ngon e acessá-los em JavaScript
No controlador:
Em JavaScript:
Ele permite que qualquer objeto CLR antigo simples (POCOs) possa ser serializado usando o padrão
JavascriptSerializer
.fonte
Há também mais uma opção que @: e
<text></text>
.Usando o
<script>
próprio bloco.Quando você precisa criar grandes pedaços de JavaScript, dependendo do código do Razor, pode fazê-lo assim:
Prós dessa maneira é que ele não mistura muito JavaScript e Razor, porque misturá-los bastante causará problemas de legibilidade eventualmente. Também grandes blocos de texto também não são muito legíveis.
fonte
Nenhuma das soluções anteriores funciona corretamente ... Eu tentei de todas as formas, mas não me deu o resultado esperado ... Finalmente, descobri que existem alguns erros no código ... E o código completo é fornecido abaixo.
fonte
Finalmente encontrei a solução (* .vbhtml):
fonte