【问题标题】:Razor Syntax and JavascriptRazor 语法和 Javascript
【发布时间】:2011-05-02 00:17:59
【问题描述】:

作为测试,我正在将我们编写的概念验证应用从 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#...但是我该如何阻止它呢?

谢谢,
基隆

【问题讨论】:

    标签: javascript razor asp.net-mvc-3


    【解决方案1】:

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

    如果您注意到您的 asp.net 网络表单中的差异,您可以使用 %&gt; 结束 &lt;% for 行,这会将其退出 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>
    

    【讨论】:

    • 太好了,谢谢 - 我会在我回到办公室时尝试一下。这些扩展在哪里……它们在图库中吗?
    • 是的,只要在视觉工作室画廊搜索“Razor”或者你可以去visualstudiogallery.msdn.microsoft.com/en-us/…
    • 如果它只是需要解析的单行内容,您可以使用 Razor 的 '@:' 前缀,例如@:availableIds.push(...)
    • 您能说说将代码包装在&lt;text&gt; 中的基本优势吗?在 Js/Html/server 代码的情况下。
    • &lt;text&gt; 只告诉剃须刀解析器这应该输出到浏览器。否则解析器会假定它是代码。因为它不是 html 元素。
    猜你喜欢
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多