Синтаксис бритвы и Javascript

В качестве теста я конвертирую приложение с доказательством концепции, которое мы пишем из веб-форм в 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: недопустимый термин выражения '{'

Очевидно, он пытается скомпилировать его как С#... но как его остановить?

Спасибо,
Кирон

Ответ 1

Вам нужно обернуть его в псевдоэлемент <text>. Это переключит синтаксический анализатор обратно в html-режим и затем проанализирует javascript как часть html, а не С#. Причина, по которой это происходит, заключается в том, что @for() является блоком С#, и все, что обрабатывается внутри, также считается С#, пока оно не экранируется тегом html. Поскольку вы, вероятно, не хотите, чтобы бритва html-тега отображала тег <text> для переключения режимов.

Если вы заметили разницу в ваших веб-формах asp.net, вы заканчиваете строку <% for с помощью %>, которая выводит ее из режима С#. Если вы загрузите расширение ярлыка бритвы для 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>