55

テストとして、私たちが作成した概念実証アプリをWebフォームからRazorに変換しているので、それを評価することができます。

これまでに1つの問題が発生し、頭が痛くなっています。クライアント側の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:無効な式の用語'{'

それは明らかにそれをC#としてコンパイルしようとしています...しかしどうすればそれを止めることができますか?

ありがとう、
キエロン

4

1 に答える 1

102

疑似要素でラップする必要があります<text>。これにより、パーサーが html モードに戻り、javascript が c# ではなく html の一部として解析されます。これが発生する理由は@for()is ac# ブロックであり、その中で処理されるものはすべて、html タグによってエスケープされるまで c# と見なされます。おそらくhtmlタグは必要ないので、razorは<text>モードを切り替えるタグを提供します。

asp.net Webフォームの違いに気付いた場合は、<% for行を a%>で終了して、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>
于 2010-10-28T21:39:45.480 に答える