2011-02-09 13 views
27

Tengo una vista parcial en la máquina de afeitar. Cuando lo ejecuto, aparece el siguiente error: parece que Razor se queda atrapada pensando que estoy escribiendo código en todas partes.Palabra clave "foreach" inesperada después del carácter "@"

Palabra clave "foreach" inesperada después del carácter "@". Una vez dentro del código, no es necesario prefijar construcciones como "foreach" con "@"

Aquí está mi punto de vista:

@model IEnumerable<SomeModel> 

<div> 
@using(Html.BeginForm("Update", "UserManagement", FormMethod.Post)) { 

    @Html.Hidden("UserId", ViewBag.UserId) 

@foreach(var link in Model) { 
    if(link.Linked) { 
     <input type="checkbox" name="userLinks" value="@link.Id" checked="checked" />@link.Description<br /> 
    } else { 
     <input type="checkbox" name="userLinks" value="@link.Id" />@link.Description<br />   
    } 
} 

} 
</div> 

Respuesta

47

Dentro de su bloque using, la maquinilla de afeitar está a la espera fuente C#, no HTML .

Por lo tanto, debe escribir foreach sin un @.

Dentro de una etiqueta HTML, Razor espera el marcado, por lo que usaría @.

Por ejemplo:

<div> 
    <!-- Markup goes here --> 
    @if (x) { 
     //Code goes here 
     if (y) { 
      //More code goes here 
      <div> 
       <!-- Markup goes here --> 
       @if (z) { } 
      </div> 
     } 
    } 
</div> 

Sólo es necesario un @ si desea colocar el código en el que está esperando marcado, o si quieren escribir la salida en cualquier lugar.

Para colocar marcas no similares a etiquetas donde se espera el código, use @: o <text>.

+2

+1 - Estoy encontrando que esto es mi # 1 obstáculo en el aprendizaje de la maquinilla de afeitar. Mi cerebro simplemente no parece reconocer la diferencia de inmediato. Mejorando en eso, pero todavía me encuentro escribiendo lo incorrecto y luego tengo que pensar en cómo hacerlo nuevamente. –

+0

Sí; esta es una distinción sutil pero importante. Estoy planeando escribir una publicación en el blog sobre esto como parte de mi serie Dissecting Razor, pero aún quedan cuatro partes más que deben ser lo primero. – SLaks

+0

@Slaks - Yah, el salto adelante y atrás entre el código y el marcado como este me parece incorrecto. Es un poco insufrible desde que llevo unos años en un entorno de "código o marcado pero no ambos". Definitivamente vale la pena la frustración temporal sin embargo. Estoy bebiendo la navaja koolaid a lo grande. –

2

Solo quiero agregar a SLaks que el marcado no molesta en realidad la sección del código solo dentro del marcado, y tan pronto como se alcanza la etiqueta de cierre, vuelve a la sección de marcado.

Y similar es una vez dentro del marcado, debe utilizar el símbolo @ incluso después del código.

decir, por ejemplo de tener lo siguiente:

@if(true) { 
     <span> 
      Markup section here, you need to include the @symbol 
      @if(1 = 1) 
      { 
      } 
      @if(2 = 2) @* The @ symbol here is required *@ 
      { 
      }     
     </span> 
     @: Code section back here, to output you need the "@:" symbol to display markup, although it is after the markup 
     if(false) @* Here the @ symbol isn't required *@ 
     { 
      some_statment; @* This will not be sent to the browser *@ 
      @display_someStament @* If we want to send it to the browser, 
        then we need the @ symbol even in the code section *@ 
     } 
}