它是可能的,或有一个工作区,以使用Razor语法在JavaScript中,是在一个视图(cshtml)?

我正在尝试添加标记到谷歌地图…例如,我尝试了这个,但我得到了大量的编译错误:

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

当前回答

只要它在CSHTML页面中,而不是外部JavaScript文件中,就可以正常工作。

Razor模板引擎不关心输出什么,也不区分<script>或其他标记。

但是,您需要对字符串进行编码以防止XSS攻击。

其他回答

您看到了哪些具体的错误?

这样做会更好:

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

注意,foreach后面需要神奇的<text>标记来指示Razor应该切换到标记模式。

我更喜欢“<!——" "——>"就像一个"文本>"

<script type="text/javascript">
//some javascript here     

@foreach (var item in itens)
{                 
<!--  
   var title = @(item.name)
    ...
-->

</script>

我终于找到了解决方案(*.vbhtml):

function razorsyntax() {
    /* Double */
    @(MvcHtmlString.Create("var szam =" & mydoublevariable & ";"))
    alert(szam);

    /* String */
    var str = '@stringvariable';
    alert(str);
}

使用<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中的@:语法的文章,如果你只有一两行JavaScript代码要添加的话,它比<text>标签稍微简单一些。下面的方法可能更可取,因为它减少了生成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。属性语法,表示它应该直接输出这些属性的内容。

更新2

值得注意的是,视图代码确实不是放置JavaScript代码的好地方。JavaScript代码应该放在一个静态的.js文件中,然后它应该从Ajax调用或从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);
});

还有一个选项比@:和<text></text>。

使用<脚本>块本身。

当你需要依赖Razor代码执行大块JavaScript时,你可以这样做:

@if(Utils.FeatureEnabled("Feature")) {
    <script>
        // If this feature is enabled
    </script>
}

<script>
    // Other JavaScript code
</script>

这种方式的优点是它不会过多地混合JavaScript和Razor,因为过多地混合它们最终会导致可读性问题。此外,大的文本块也不是很可读。