2012-03-14 17 views
30

que estoy tratando de hacer una simple If/Else dentro de un foreach con este código:simple If/Else Razor Sintaxis

@{ 
var count = 0; 
foreach (var item in Model) 
{ 
    if (count++ % 2 == 0) 
    { 
     @:<tr class="alt-row"> 
    } else { 
     @:<tr> 
    } 
     <td> 
      @Html.DisplayFor(modelItem => item.Title) 
     </td> 
     <td> 
      @Html.Truncate(item.Details, 75) 
     </td> 
     <td> 
      <img src="@Url.Content("~/Content/Images/Projects/")@item.Images.Where(i => i.IsMain == true).Select(i => i.Name).Single()" 
       alt="@item.Images.Where(i => i.IsMain == true).Select(i => i.AltText).Single()" class="thumb" /> 
     </td> 
     <td> 
      @Html.ActionLink("Edit", "Edit", new { id=item.ProjectId }) | 
      @Html.ActionLink("Details", "Details", new { id = item.ProjectId }) | 
      @Html.ActionLink("Delete", "Delete", new { id=item.ProjectId }) 
     </td> 
    </tr> 
} 
} 

me sale un error de análisis "detectado el final etiqueta 'tr' sin inicio coincidente etiqueta. ¿Están sus etiquetas de inicio/final correctamente equilibradas? ". Parece que la declaración if no quiere funcionar.

Respuesta

37

Sólo tiene que utilizar esto para la etiqueta de cierre:

@:</tr> 

y dejar su if/else como se muestran.

Parece que la declaración if no quiere funcionar.

funciona bien. Estás trabajando en 2 espacios de idiomas aquí, parece apropiado no dividir los sándwiches abiertos/cerrados sobre la frontera.

+1

Gracias. Traté @ solución de DJQuimby y poco trabajado, pero el otro ya no se destacó azul y me dio este mensaje "El bloque de código le falta un cierre '}' carácter. Asegúrate de que tienes un juego '}' con un personaje en el" { "caracteres dentro de este bloque, y que ninguno de los caracteres"} "se interpreta como marcado." Su solución funcionó, gracias por sus dos sugerencias. –

+1

@Henk Holterman Gracias por su respuesta. Sin embargo, en Visual Studio Si presiono ctrl + k + D de alinear el código, es reformatear como @: ( se mueve a la siguiente línea). Entonces, ¿volver a causar el mismo error –

+0

tiene una solución para este Pahul? – CularBytes

9

sólo iría con

<tr @(if (count++ % 2 == 0){<text>class="alt-row"</text>})> 

O mejor aún

<tr class="[email protected](count++ % 2)"> 

esto le dará líneas como

<tr class="alt-row0"> 
<tr class="alt-row1"> 
<tr class="alt-row0"> 
<tr class="alt-row1"> 
+0

¿Por qué tiene una etiqueta '' allí? –

+1

Lo sentimos, descubrí por qué: https://weblogs.asp.net/scottgu/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax –

5

Un poco fuera de tema tal vez, pero para los navegadores modernos (IE9 y más reciente) puede usar los selectores css impar/par para lograr lo que quiere.

tr:nth-child(even) { /* your alt-row stuff */} 
tr:nth-child(odd) { /* the other rows */ } 

o

tr { /* all table rows */ } 
tr:nth-child(even) { /* your alt-row stuff */} 
0

para deshacerse del caso de incomodidad/otra cosa que podría utilizar un bloque using:

@{ 
    var count = 0; 
    foreach (var item in Model) 
    { 
     using(Html.TableRow(new { @class = (count++ % 2 == 0) ? "alt-row" : "" })) 
     { 
      <td> 
       @Html.DisplayFor(modelItem => item.Title) 
      </td> 
      <td> 
       @Html.Truncate(item.Details, 75) 
      </td> 
      <td> 
       <img src="@Url.Content("~/Content/Images/Projects/")@item.Images.Where(i => i.IsMain == true).Select(i => i.Name).Single()" 
        alt="@item.Images.Where(i => i.IsMain == true).Select(i => i.AltText).Single()" class="thumb" /> 
      </td> 
      <td> 
       @Html.ActionLink("Edit", "Edit", new { id=item.ProjectId }) | 
       @Html.ActionLink("Details", "Details", new { id = item.ProjectId }) | 
       @Html.ActionLink("Delete", "Delete", new { id=item.ProjectId }) 
      </td> 
     } 
    } 
} 

elemento reutilizable que hacen que sea más fácil añadir atributos:

//Block is take from http://www.codeducky.org/razor-trick-using-block/ 
public class TableRow : Block 
{ 
    private object _htmlAttributes; 
    private TagBuilder _tr; 

    public TableRow(HtmlHelper htmlHelper, object htmlAttributes) : base(htmlHelper) 
    { 
     _htmlAttributes = htmlAttributes; 
    } 

    public override void BeginBlock() 
    { 
     _tr = new TagBuilder("tr"); 
     _tr.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(_htmlAttributes)); 
     this.HtmlHelper.ViewContext.Writer.Write(_tr.ToString(TagRenderMode.StartTag)); 
    } 

    protected override void EndBlock() 
    { 
     this.HtmlHelper.ViewContext.Writer.Write(_tr.ToString(TagRenderMode.EndTag)); 
    } 
} 

método ayudante para que la maquinilla de afeitar sintaxis más clara:

public static TableRow TableRow(this HtmlHelper self, object htmlAttributes) 
{ 
    var tableRow = new TableRow(self, htmlAttributes); 
    tableRow.BeginBlock(); 
    return tableRow; 
} 
Cuestiones relacionadas