在视图( cshtml
)中的JavaScript中使用Razor语法是否可行或有解决方法?
我正在尝试将标记添加到Google Map 中...例如,我试过这个,但是我收到了大量的编译错误:
<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>
12 回答
只要它在CSHTML页面而不是外部JavaScript文件中,这样就可以正常工作 .
Razor模板引擎不会输出't care what it'或其他标签 .
但是,您需要对字符串进行编码以防止XSS攻击 .
我更喜欢“<! - ”“ - >”喜欢“文字>”
你试图把一个方形的钉子塞进圆孔里 .
Razor旨在用作生成HTML的模板语言 . 您很可能会生成JavaScript代码,但它不是为此而设计的 .
例如:如果
Model.Title
包含撇号怎么办?这会破坏您的JavaScript代码,默认情况下Razor无法正确转义它 .在辅助函数中使用String生成器可能更合适 . 这种方法可能会产生更少的意外后果 .
您看到了哪些具体错误?
像这样的东西可以更好地工作:
请注意,您需要在
foreach
之后使用神奇的<text>
标记来指示Razor应切换到标记模式 .使用
<text>
伪元素(如here所述)强制Razor编译器返回内容模式:Update:
Scott Guthrie recently posted关于Razor中的
@:
语法,如果你只需要添加一行或两行JavaScript代码,它就会比<text>
标签略显笨重 . 以下方法可能更可取,因为它减少了生成的HTML的大小 . (您甚至可以将addMarker函数移动到静态缓存的JavaScript文件中以进一步减小大小):更新了上面的代码,使对
addMarker
的调用更加正确 .为了澄清,
@:
迫使Razor回到文本模式,即使addMarker
调用看起来很像C#代码 . 然后Razor选择@item.Property
语法来说它应该直接输出这些属性的内容 .更新2
它是放置JavaScript代码的好地方 . JavaScript代码应放在静态
.js
文件中,然后它应该从Ajax调用或从HTML扫描data-
属性获取所需的数据 . 除了可以缓存JavaScript代码之外,这还避免了编码问题,因为Razor旨在编码HTML,而不是JavaScript .查看代码
JavaScript代码
我刚写了这个辅助函数 . 把它放在
App_Code/JS.cshtml
:然后在您的示例中,您可以执行以下操作:
注意我怎么不在它周围加上引号 . 如果 Headers 已包含引号,则不会爆炸 . 似乎也很好地处理字典和匿名对象!
有一点要补充 - 我发现Razor语法hilighter(可能还有编译器)以不同的方式解释了开括号的位置:
以下解决方案似乎比将JavaScript与Razor结合起来更准确 . 看看这个:https://github.com/brooklynDev/NGon
您可以将几乎任何复杂数据添加到 ViewBag.Ngon 并在 JavaScript 中访问它
In the controller:
In JavaScript:
它允许使用默认
JavascriptSerializer
序列化的任何plain old CLR objects(POCO) .一个简单而好的直截了当的例子:
这会在页面中放置代码的位置创建一个脚本,如下所示:
现在您有一个名为
razorUserName
的全局JavaScript变量,您可以在客户端上访问和使用它 . Razor引擎显然从@User.Identity.Name
(服务器端变量)中提取了值,并将其放入写入脚本标记的代码中 .除了@:和
<text></text>
之外,还有一个选项 .使用
<script>
块本身 .当您需要根据Razor代码执行大量JavaScript时,您可以这样做:
这种方式的优点是它不会混淆JavaScript和Razor太多,因为混合它们会最终导致可读性问题 . 大文本块也不是很易读 .
以前的解决方案都没有正常工作......我已经尝试了所有的方法,但它没有给我预期的结果......最后我发现代码中有一些错误......下面给出了完整的代码 .
我终于找到了解决方案(* .vbhtml):