JavaScript 내에서 Razor 사용 JavaScript 내에서 Razor

뷰 ( 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>