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