Razor语法和Javascript

Razor语法和Javascript,javascript,razor,asp.net-mvc-3,Javascript,Razor,Asp.net Mvc 3,作为测试,我正在将我们编写的一个概念验证应用程序从Web表单转换为Razor,以便我们能够对其进行评估 到目前为止,我遇到了一个让我头疼的问题..生成客户端Javascript 网络表单 var jqgridlist=“”; var availableIds=[]; 推送({value:,label:}); 剃刀语法 var jqgridlist=“@Url.Action(“getidlist”,“office”,new{area=“reports”})”; var availableId

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

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

网络表单

var jqgridlist=“”;
var availableIds=[];
推送({value:,label:});
剃刀语法

var jqgridlist=“@Url.Action(“getidlist”,“office”,new{area=“reports”})”;
var availableIds=[];
@对于(var i=0;i
编译器在“availableIds.push”行上给出以下错误:

编译器错误消息:CS1525:无效的表达式项“{”

很明显,它试图将其编译为C#…但是我如何阻止它呢

谢谢,

Kieron

您需要将其包装在伪元素
中。这会将解析器切换回html模式,然后它会将javascript作为html的一部分而不是c进行解析。发生这种情况的原因是
@for()
是一个c#块,其中处理的任何内容也被视为c#,直到它被html标记转义。因为您可能不需要html标记,razor提供了切换模式的
标记

如果您注意到asp.net webforms中的差异,您将结束
,这将使其脱离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>

非常好,谢谢-我回到办公室后会试试。那些扩展在哪里…它们在图库中吗?是的,只要在visual studio图库中搜索“Razor”,或者如果只是一行需要解析的内容,您可以使用Razor的“@:”前缀,例如@:availableIds.push(…)对于Js/Html/服务器代码,
只告诉razor解析器应该将其输出到浏览器。否则解析器会假定它是代码。因为它不是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++) {
    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++) {
        <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>