Użyj <text>
pseudoelementu, jak opisano tutaj , aby zmusić kompilator Razor z powrotem do trybu zawartości:
<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>
Aktualizacja:
Scott Guthrie niedawno napisał o @:
składni w Razor, która jest nieco mniej niezręczna niż <text>
tag, jeśli masz tylko jeden lub dwa wiersze kodu JavaScript do dodania. Preferowane byłoby prawdopodobnie następujące podejście, ponieważ zmniejsza ono rozmiar generowanego HTML. (Możesz nawet przenieść funkcję addMarker do statycznego, buforowanego pliku JavaScript, aby dodatkowo zmniejszyć rozmiar):
<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>
Zaktualizowałem powyższy kod, aby poprawić addMarker
poprawność połączenia.
Aby to wyjaśnić, @:
zmusza Razor z powrotem do trybu tekstowego, mimo że addMarker
wywołanie przypomina kod C #. Razor pobiera następnie @item.Property
składnię, aby powiedzieć, że powinna bezpośrednio wypisywać zawartość tych właściwości.
Aktualizacja 2
Warto zauważyć, że kod View naprawdę nie jest dobrym miejscem do umieszczenia kodu JavaScript. Kod JavaScript powinien zostać umieszczony w .js
pliku statycznym , a następnie powinien uzyskać potrzebne dane albo z wywołania Ajax, albo poprzez skanowanie data-
atrybutów z HTML. Oprócz umożliwienia buforowania kodu JavaScript, pozwala to również uniknąć problemów z kodowaniem, ponieważ Razor został zaprojektowany do kodowania HTML, ale nie JavaScript.
Wyświetl kod
@foreach(var item in Model)
{
<div data-marker="@Json.Encode(item)"></div>
}
Kod JavaScript
$('[data-marker]').each(function() {
var markerData = $(this).data('marker');
addMarker(markerData.Latitude, markerData.Longitude,
markerData.Description, markerData.Title);
});
@:
składni.