뷰 ( cshtml
) 에있는 JavaScript 내에서 Razor 구문을 사용하는 것이 가능합니까, 아니면 해결 방법이 있습니까?
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>
답변
여기 에 <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>
최신 정보:
Scott Guthrie는 최근@:
에 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에서 속성을 스캔하여 필요한 데이터를 가져와야 합니다. Razor는 JavaScript가 아닌 HTML을 위해 인코딩되도록 설계되었으므로 JavaScript 코드를 캐시 할 수있게하는 것 외에도 인코딩 문제를 피할 수 있습니다.
코드보기
@foreach(var item in Model)
{
<div data-marker="@Json.Encode(item)"></div>
}
자바 스크립트 코드
$('[data-marker]').each(function() {
var markerData = $(this).data('marker');
addMarker(markerData.Latitude, markerData.Longitude,
markerData.Description, markerData.Title);
});
답변
방금이 도우미 함수를 작성했습니다. 그것을 넣어 App_Code/JS.cshtml
:
@using System.Web.Script.Serialization
@helper Encode(object obj)
{
@(new HtmlString(new JavaScriptSerializer().Serialize(obj)));
}
그런 다음 예제에서 다음과 같이 할 수 있습니다.
var title = @JS.Encode(Model.Title);
인용 부호를 넣지 않은 방법에 주목하십시오. 제목에 이미 따옴표가 포함되어 있으면 폭발하지 않습니다. 사전과 익명 객체도 훌륭하게 처리하는 것 같습니다!
답변
둥근 구멍에 사각형 못을 끼 우려 고합니다.
Razor는 HTML 생성 템플릿 언어로 고안되었습니다. JavaScript 코드를 생성하는 것이 좋을 수도 있지만 그렇게 설계되지 않았습니다.
예를 들어 : Model.Title
아포스트로피 가 포함되어 있으면 어떻게 됩니까? 그러면 JavaScript 코드가 손상되고 Razor는 기본적으로 올바르게 이스케이프하지 않습니다.
도우미 함수에서 문자열 생성기를 사용하는 것이 더 적절할 것입니다. 이 접근 방식의 의도하지 않은 결과는 줄어들 것입니다.
답변
어떤 특정 오류가 표시됩니까?
이와 같은 것이 더 잘 작동 할 수 있습니다.
<script type="text/javascript">
//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>'
</text>
}
</script>
Razor가 마크 업 모드로 전환해야 함을 나타 내기 위해 <text>
뒤에 매직 태그 가 필요 foreach
합니다.
답변
외부 JavaScript 파일이 아닌 CSHTML 페이지에있는 한 정상적으로 작동합니다.
Razor 템플릿 엔진은 출력되는 내용에 신경 쓰지 않으며 <script>
다른 태그 나 다른 태그를 구별하지 않습니다 .
그러나 XSS 공격 을 방지하려면 문자열을 인코딩해야합니다 .
답변
“text!”와 같이 “<!-” “->”를 선호합니다.
<script type="text/javascript">
//some javascript here
@foreach (var item in itens)
{
<!--
var title = @(item.name)
...
-->
</script>
답변
추가해야 할 사항-Razor 구문 하이 라이터 (및 컴파일러)는 여는 괄호 위치를 다르게 해석한다는 것을 알았습니다.
<script type="text/javascript">
var somevar = new Array();
@foreach (var item in items)
{ // <---- placed on a separate line, NOT WORKING, HILIGHTS SYNTAX ERRORS
<text>
</text>
}
@foreach (var item in items) { // <---- placed on the same line, WORKING !!!
<text>
</text>
}
</script>