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

Foi útil?

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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top