Возможно ли или есть обходной путь для использования синтаксиса Razor в JavaScript, который находится в представлении ( cshtml
)?
Я пытаюсь добавить маркеры на карту Google ... Например, я пробовал это, но я получаю кучу ошибок компиляции:
<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
источник
источник
@:
синтаксиса.Ответы:
Используйте
<text>
псевдоэлемент, как описано здесь , чтобы принудительно вернуть Razor-компилятор в режим содержимого:Обновить:
Скотт Гатри недавно написал о
@:
синтаксисе в Razor, который немного менее неуклюж, чем<text>
тег, если вам нужно добавить одну или две строки кода JavaScript. Следующий подход, вероятно, будет предпочтительным, поскольку он уменьшает размер сгенерированного HTML. (Вы можете даже переместить функцию addMarker в статический, кэшированный файл JavaScript, чтобы еще больше уменьшить размер):Обновлен код выше, чтобы сделать звонок
addMarker
более корректным.Для пояснения,
@:
заставляет Razor вернуться в текстовый режим, хотяaddMarker
call выглядит во многом как код C #. Затем Razor выбирает@item.Property
синтаксис, чтобы сказать, что он должен напрямую выводить содержимое этих свойств.Обновление 2
Стоит отметить, что код View действительно не подходит для размещения кода JavaScript. Код JavaScript должен быть помещен в статический
.js
файл, а затем он должен получить необходимые данные либо из вызова Ajax, либо путем сканированияdata-
атрибутов из HTML. Помимо возможности кэширования вашего кода JavaScript, это также позволяет избежать проблем с кодированием, поскольку Razor предназначен для кодирования для HTML, но не для JavaScript.Посмотреть код
Код JavaScript
источник
@item.Title
содержит одну кавычку, этот код взорвется.data-
атрибутами, а затем использовать статические, ненавязчивый JavaScript , чтобы почерпнуть эту информацию из DOM. Но вся эта дискуссия выходила за рамки вопроса.Я только что написал эту вспомогательную функцию. Поместите это в
App_Code/JS.cshtml
:Тогда в вашем примере вы можете сделать что-то вроде этого:
Обратите внимание, как я не ставлю кавычки вокруг этого. Если заголовок уже содержит кавычки, он не взорвется. Кажется, хорошо справляются со словарями и анонимными объектами!
источник
@Html.Raw(Json.Encode(Model))
Вы пытаетесь засунуть квадратный колышек в круглое отверстие.
Razor был задуман как язык шаблонов, генерирующий HTML. Вы можете получить его для генерации кода JavaScript, но он не предназначен для этого.
Например: что, если
Model.Title
содержит апостроф? Это нарушит ваш код JavaScript, и Razor по умолчанию не сможет его избежать.Вероятно, было бы более целесообразно использовать генератор String в вспомогательной функции. Вероятно, будет меньше непредвиденных последствий такого подхода.
источник
Какие конкретные ошибки вы видите?
Нечто подобное может работать лучше:
Обратите внимание, что вам нужен магический
<text>
тег после,foreach
чтобы указать, что Razor должен переключиться в режим разметки.источник
Это будет хорошо работать, если оно находится на странице CSHTML, а не во внешнем файле JavaScript.
Движок шаблонов Razor не заботится о том, что он выводит, и не различает
<script>
другие теги.Однако вам нужно кодировать свои строки, чтобы предотвратить атаки XSS .
источник
HTML.Raw(Server.JavaScriptStringEncode(...))
HTML.Raw(HttpUtility.JavaScriptStringEncode(...))
- Свойство сервера не имеет этот метод сейчас. HttpUtility делает.The Razor template engine doesn't care what it's outputting and does not differentiate between <script> or other tags.
Вы уверены, что аобуть это? stackoverflow.com/questions/33666065/…Я предпочитаю "<! -" "->" как "текст>"
источник
@:
и<text>
методамиОдна вещь, которую нужно добавить - я обнаружил, что синтаксис Razor hilighter (и, возможно, компилятор) по-разному интерпретирует положение открывающей скобки:
источник
Простой и хороший прямой пример:
Это создаст скрипт на вашей странице в том месте, где вы разместили код выше, который выглядит следующим образом:
Теперь у вас есть глобальная переменная JavaScript,
razorUserName
которую вы можете использовать и использовать на клиенте. Ядро Razor, очевидно, извлекло значение из@User.Identity.Name
(серверной переменной) и поместило его в код, который записывается в тэг скрипта.источник
Следующее решение кажется мне более точным, чем объединение JavaScript с Razor. Проверьте это: https://github.com/brooklynDev/NGon
Вы можете добавить практически любые сложные данные в ViewBag.Ngon и получить к ним доступ в JavaScript
В контроллере:
В JavaScript:
Это позволяет любые простые старые объекты CLR (POCO), которые могут быть сериализованы, используя значение по умолчанию
JavascriptSerializer
.источник
Существует также еще одна опция, чем @: и
<text></text>
.Используя
<script>
сам блок.Когда вам нужно сделать большие куски JavaScript в зависимости от кода Razor, вы можете сделать это следующим образом:
Плюсы этого способа в том, что он не слишком смешивает JavaScript и Razor, потому что их частое смешивание в конечном итоге вызовет проблемы с читабельностью. Также большие текстовые блоки не очень читабельны.
источник
Ни одно из предыдущих решений не работает правильно ... Я перепробовал все способы, но он не дал мне ожидаемого результата ... Наконец я обнаружил, что в коде есть некоторые ошибки ... И полный код дан ниже.
источник
Я наконец нашел решение (* .vbhtml):
источник