剃刀语法和Javascript

作为一个testing,我将我们从Web Forms写成的概念validation应用程序转换为Razor,简单地说我们可以评估它。

到目前为止,我遇到了一个问题,使我的头受伤..生成客户端JavaScript …

web的表单

<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:无效的expression式项“{”

这显然是试图编译为C#…但我该如何阻止它?

谢谢,
基隆

您需要将其包装在伪元素<text> 。 这将把parsing器切换回html模式,然后将parsingjavascript作为html的一部分而不是c#。 它发生的原因是@for()是ac#块,任何内部处理的内容也被认为是C#直到它被一个HTML标记转义。 由于您可能不希望html标签razor提供<text>标签来切换模式。

如果你注意到你的asp.net webforms中的不同,你可以用<% for line用%>来取代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>