2011-05-23 7 views
16

Recientemente actualicé un proyecto de MVC 1 a MVC 3 y ahora estoy probando Razor.Pregunta sobre las declaraciones de bloque de código anidado en Razor

En una vista, tengo un bloque de código foreach, pero la declaración if anidada no parece querer la @ delante de ella.

Mi código original:

@foreach(var r in Model.Results) 
{ 
    string css = r.Result.Count() > 0 ? "fail" : "pass"; 

    <p class="@css"><strong>@r.Description</strong></p> 

    @if(r.Result.Count() > 0) 
    { 
     <p>Count: @r.Result.Count()</p> 
     <table> 
      <thead> 
       <tr> 
        <th>ID</th><th>Title</th><th>Description</th> 
       </tr> 
      </thead> 
      <tbody> 
      @foreach(var e in r.Result) { 
       <tr><td>@e.Id</td><td>@e.Title</td><td>@e.Description</td></tr> 
      } 
      </tbody> 
     </table> 
    } 
} 

Voy a buscar un error de ejecución con @if que dice: Inesperado "si" después de la palabra clave de carácter "@". Una vez dentro del código, no es necesario que prefija construcciones como "si" con "@".

Si elimino @ el código funciona bien. Esperaba necesitar el @ debido al HTML que lo precede inmediatamente. Lo que me confunde más es que necesito el @ antes del foreach anidado. ¿Cuáles son las reglas en juego aquí?

+0

Hay una pregunta similar aquí, pero todavía no tengo clara la diferencia entre @if y @foreach. http://stackoverflow.com/questions/4946334/razor-unexpected-foreach-keyword-after-character – Mattio

Respuesta

4

El foreach anidado está dentro de HTML (que pasa a estar dentro de otro código).

Para ir de markup al código, necesita un @.
Solo es innecesario cuando directamente bloques de código de anidamiento.

+0

Pensé que esto era claro y sucinto – gstar

34

Dentro de los paréntesis de la hoja de afeitar, se espera una etiqueta de inicio y finalización coincidente. Así es como funciona el analizador.

ejemplo Hasta ahora lo siguiente es válido:

@for (var i = 0; i < 10; i++) { 
<p> 
    @i.ToString() 
</p> 
} 

Y esto no es:

@for (var i = 0; i < 10; i++) { 
<p> 
    @i.ToString() 
</p> 
@if (i == 2) { 
<p>2</p> 
} 
} 

Para evitar esto se puede colocar dentro de un bloque <text> como:

@for (var i = 0; i < 10; i++) { 
<text> 
<p> 
    @i.ToString() 
</p> 
@if (i == 2) { 
<p>2</p> 
} 
</text> 
} 

Entonces en su caso se convertiría en:

@foreach(var r in Model.Results) 
{ 
    @string css = r.Result.Count() > 0 ? "fail" : "pass"; 
<text> 

    <p class="@css"><strong>@r.Description</strong></p> 

    @if(r.Result.Count() > 0) 
    { 
    <p>Count: @r.Result.Count()</p> 
    <table> 
     <thead> 
      <tr> 
       <th>ID</th><th>Title</th><th>Description</th> 
      </tr> 
     </thead> 
     <tbody> 
     @foreach(var e in r.Result) { 
      <tr><td>@e.Id</td><td>@e.Title</td><td>@e.Description</td></tr> 
     } 
     </tbody> 
    </table> 
    } 
</text> 
} 
+2

Wow, esto no es intuitivo. ¿Alguien sabe si esto es un error en la afeitadora? –

+1

Consulte ... https://weblogs.asp.net/scottgu/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax –

Cuestiones relacionadas