Razor 语法和 Javascript

IT技术 javascript razor asp.net-mvc-3
2021-03-02 12:42: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#...但我该如何阻止它?

谢谢,
基隆

1个回答

您需要将其包装在伪元素中<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>
太好了,谢谢 - 我回到办公室后会尝试这样做。这些扩展在哪里......它们在画廊中吗?
2021-04-26 12:42:59
如果它只是需要解析的一行内容,您可以使用 Razor 的“@:”前缀,例如 @:availableIds.push(...)
2021-05-06 12:42:59
您能说出将代码包装在 中的基本优点<text>吗?Js/Html/服务器代码的情况下
2021-05-11 12:42:59
<text>只告诉 razor 解析器这应该输出到浏览器。否则解析器会假设它是代码。因为它不是 html 元素。
2021-05-13 12:42:59
是的,只需在visual-studio图库中搜索“Razor”,或者您可以访问visualstudiogallery.msdn.microsoft.com/en-us/...
2021-05-15 12:42:59