Sintaxe e JavaScript de Razor
-
27-09-2019 - |
Pergunta
Como teste, estou convertendo um aplicativo de prova de conceito que escrevemos de formulários da Web para Razor, simplesmente para que possamos avaliá-lo.
Eu encontrei um problema até agora que está fazendo minha cabeça doer .. Gerando JavaScript do lado do cliente ...
Formulários da 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>
Sintaxe de barbear
<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>
O compilador me dá o seguinte erro na linha 'disponívels.push':
Mensagem de erro do compilador: cs1525: termo de expressão inválida '{'
Obviamente, está tentando compilá -lo como C#... mas como faço para parar?
Obrigado,
Kieron
Solução
Você precisa embrulhá -lo no elemento pseudo <text>
. Isso alternará o analisador de volta ao modo HTML e ele analisará o JavaScript como parte do HTML e não C#. A razão pela qual isso acontece é o @for()
O bloco AC# e qualquer coisa tratada também é considerada C# até que seja escapa por uma tag HTML. Já que você provavelmente não quer uma tag html razor fornece o <text>
Tag para alternar os modos.
Se você notar a diferença em suas formas da web asp.net, você termina o <% for
linha com um %>
o que tira o modo C#. Se você baixar a extensão do marcador de barbear para o Visual Studio 2010, ele ajudará você a ver quando o código é tratado como código e HTML é tratado como 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>
Atualização para a versão mais recente
Agora você pode usar o @:
Sintaxe para ainda mais legibilidade
<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>