Используйте <text>
псевдоэлемент, как описано здесь , чтобы принудительно вернуть Razor-компилятор в режим содержимого:
<script type="text/javascript">
// Some JavaScript code here to display map, etc.
// Now add markers
@foreach (var item in Model) {
<text>
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);
});
</text>
}
</script>
Обновить:
Скотт Гатри недавно написал о @:
синтаксисе в Razor, который немного менее неуклюж, чем <text>
тег, если вам нужно добавить одну или две строки кода JavaScript. Следующий подход, вероятно, будет предпочтительным, поскольку он уменьшает размер сгенерированного HTML. (Вы можете даже переместить функцию addMarker в статический, кэшированный файл JavaScript, чтобы еще больше уменьшить размер):
<script type="text/javascript">
// Some JavaScript code here to display map, etc.
...
// Declare addMarker function
function addMarker(latitude, longitude, title, description, map)
{
var latLng = new google.maps.LatLng(latitude, longitude);
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);
});
}
// Now add markers
@foreach (var item in Model) {
@:addMarker(@item.Latitude, @item.Longitude, '@item.Title', '@item.Description', map);
}
</script>
Обновлен код выше, чтобы сделать звонок addMarker
более корректным.
Для пояснения, @:
заставляет Razor вернуться в текстовый режим, хотя addMarker
call выглядит во многом как код C #. Затем Razor выбирает @item.Property
синтаксис, чтобы сказать, что он должен напрямую выводить содержимое этих свойств.
Обновление 2
Стоит отметить, что код View действительно не подходит для размещения кода JavaScript. Код JavaScript должен быть помещен в статический .js
файл, а затем он должен получить необходимые данные либо из вызова Ajax, либо путем сканирования data-
атрибутов из HTML. Помимо возможности кэширования вашего кода JavaScript, это также позволяет избежать проблем с кодированием, поскольку Razor предназначен для кодирования для HTML, но не для JavaScript.
Посмотреть код
@foreach(var item in Model)
{
<div data-marker="@Json.Encode(item)"></div>
}
Код JavaScript
$('[data-marker]').each(function() {
var markerData = $(this).data('marker');
addMarker(markerData.Latitude, markerData.Longitude,
markerData.Description, markerData.Title);
});
@:
синтаксиса.