web-dev-qa-db-ja.com

Razorの構文とJavascript

テストとして、私はWeb Formsから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#としてコンパイルしようとしています...しかし、どうすれば停止できますか?

おかげで、
Kieron

54
Kieron

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

Asp.net Webフォームの違いに気づいた場合、<% for_行を_%>_で終了し、c#モードから抜けます。 Visual Studio 2010用のかみそり蛍光ペン拡張機能をダウンロードすると、コードがコードとして処理され、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>
_
96
Buildstarted