Razor Синтаксис и Javascript - PullRequest
       17

Razor Синтаксис и Javascript

53 голосов
/ 28 октября 2010

В качестве теста я конвертирую приложение для проверки концепции, которое мы написали из Web Forms, в 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>

синтаксис Razor

<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 # ... но как мне его остановить??

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

1 Ответ

95 голосов
/ 29 октября 2010

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

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