55

作为测试,我正在将我们编写的概念验证应用程序从 Web 表单转换为 Razor,以便我们对其进行评估。

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

网络表格

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

剃刀语法

<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#...但是我该如何阻止它呢?

谢谢,
基龙

4

1 回答 1

102

您需要将其包装在伪元素中<text>。这会将解析器切换回 html 模式,然后它将 javascript 解析为 html 而不是 c# 的一部分。它发生的原因是@for()is ac# 块,并且在其中处理的任何内容也被视为 c#,直到它被 html 标记转义。因为你可能不想要一个 html 标签,razor 提供<text>标签来切换模式。

如果您注意到您的 asp.net webforms 中的差异,请<% for以 a 结束该行,%>这会将其退出 c# 模式。如果您下载 Visual Studio 2010 的 razor highlighter 扩展,它将帮助您了解何时将代码视为代码,何时将 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>
于 2010-10-28T21:39:45.480 回答