剃刀语法和Javascript

58

作为一项测试,我正在将我们编写的概念验证程序从Web Forms转换为Razor,仅仅是为了我们能够对其进行评估。

到目前为止,我遇到了一个让我头疼的问题...如何生成客户端JavaScript...

Web Forms

<script type="text/javascript">
    var jqGridIdList = "<%: Url.Action ("getidlist", "office", new { area = "reports" }) %>";

    var availableIds = [];
    <% for (var i = 0; i < Model.Data.Count (); i++) { %>
    availableIds.push({ value : "<%: Model.Data.ElementAt (i).Text %>", label : "<%: Model.Data.ElementAt (i).Text %>" });
    <% } %>
</script>

Razor语法

<script type="text/javascript">
    var jqGridIdList = "@Url.Action("getidlist", "office", new { area = "reports" })";

    var availableIds = [];
    @for(var i = 0; i < Model.Data.Count (); i++) {
    availableIds.push({ value : "@Model.Data.ElementAt(i).Text", label : "@Model.Data.ElementAt(i).Text" });
    }
</script>

编译器在'availableIds.push'这一行给了我以下错误:

编译器错误信息:CS1525: 无效的表达式项 '{'

很明显它试图将其编译为C#代码...但我该如何停止它呢?

谢谢,
Kieron

1个回答

106
你需要将其包装在伪元素<text>中,这将切换解析器回到html模式,它将把javascript解析为html的一部分而不是c#。发生这种情况的原因是@for()是一个c#块,任何在其中处理的内容也被视为c#,直到被html标记转义。由于你可能不想要一个html标记,razor提供了<text>标记以切换模式。
如果注意到你的asp.net webforms中的差异,你可以使用%>来结束<% for行,并将其退出c#模式。如果下载visual studio 2010的razor高亮扩展程序,则可以帮助您查看何时将代码视为代码,何时将html视为html。
<script type="text/javascript">
    var jqGridIdList = "@Url.Action("getidlist", "office", new { area = "reports" })";

    var availableIds = [];
    @for(var i = 0; i < Model.Data.Count (); i++) {
        <text>availableIds.push({ value : "@Model.Data.ElementAt(i).Text", label : "@Model.Data.ElementAt(i).Text" });</text>
    }
</script>

更新至最新版本

您现在可以使用@:语法来提高可读性

<script type="text/javascript">
    var jqGridIdList = "@Url.Action("getidlist", "office", new { area = "reports" })";

    var availableIds = [];
    @for(var i = 0; i < Model.Data.Count (); i++) {
        @:availableIds.push({ value : "@Model.Data.ElementAt(i).Text", label : "@Model.Data.ElementAt(i).Text" });
    }
</script>

很好,谢谢 - 我回到办公室时会尝试的。那些扩展在哪里...他们在画廊里吗? - Kieron
1
是的,在Visual Studio Gallery中搜索“Razor”,或者您可以访问http://visualstudiogallery.msdn.microsoft.com/en-us/8dc77b9c-7c83-4392-9c46-fd15f3927a2e?SRC=Home。 - Buildstarted
1
如果只需要解析一行内容,则可以使用Razor的“@:”前缀,例如@:availableIds.push(...) - Matt Cotton
请问在JS/HTML/服务器代码中,将代码包装在<text>中的基本优点是什么? - Imad Alazani
<text> 只是告诉 Razor 解析器应该将其输出到浏览器。否则解析器会认为它是代码,因为它不是 HTML 元素。 - Buildstarted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接