在视图(cshtml)中的JavaScript中使用Razor语法是否可能,或者是否有解决方法?

我正试图在谷歌 map 上添加标记...例如,我try 过这个,但我得到了大量的编译错误:

<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>伪元素(如here所述)强制Razor编译器返回内容模式:

<script type="text/javascript">

    // Some JavaScript代码 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>

Update:

Scott Guthrie recently posted在Razor中大约有@:个语法,如果您只需要添加一两行JavaScript代码,它会比<text>标记稍微不那么笨重.以下方法可能更可取,因为它减小了生成的HTML的大小.(您甚至可以将addMarker函数移动到静电缓存的JavaScript文件中,以进一步减小大小):

<script type="text/javascript">

    // Some JavaScript代码 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>

Updated the above code to make the call to 100 more correct.

为了澄清,@:强制Razor回到文本模式,尽管addMarker调用看起来很像C#代码.然后,Razor Select @item.Property语法来说明它应该直接输出这些属性的内容.

更新2

值得注意的是,视图代码确实不是放置JavaScript代码的好地方.JavaScript代码应该放在一个静电文件中,然后它应该从AJAX调用或者通过扫描HTMLdata-属性来获得所需的数据.除了可以缓存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);
});

Javascript相关问答推荐

如何使用JavaScript动态地将CSS应用于ToDo列表?

设置默认值后动态更新japbox或调色板

Google Apps脚本中的discord邀请API响应的日期解析问题

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

Snowflake JavaScript存储过程返回成功,尽管预期失败

D3 Scale在v6中工作,但在v7中不工作

为什么当我解析一个promise时,输出处于挂起状态?

给定一个凸多边形作为一组边,如何根据到最近边的距离填充里面的区域

为什么!逗号和空格不会作为输出返回,如果它在参数上?

在Three JS中看不到补间不透明度更改效果

如何在coCos2d-x中更正此错误

如何将多维数组插入到另一个多维数组中?

将核心模块导入另一个组件模块时存在多个主题

Next.js服务器端组件请求,如何发送我的cookie token?

连接到游戏的玩家不会在浏览器在线游戏中呈现

在我的index.html页面上找不到我的Java脚本条形图

TypeError:无法读取未定义的属性(正在读取';宽度';)

无法避免UV:flat的插值:非法使用保留字"

MongoDB通过数字或字符串过滤列表

是否设置以JavaScript为背景的画布元素?