Используйте псевдоэлемент <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
очень похож на код 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);
});