2012-03-14 23 views
30

Sto cercando di fare un semplice if/else all'interno di un foreach con questo codice:semplice if/else Razor Sintassi

@{ 
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> 
} 
} 

ottengo un errore di analisi "Incontrata fine tag 'tr' senza inizio corrispondente tag. I tuoi tag start/end sono bilanciati correttamente? ". Sembra che l'affermazione if non voglia 'funzionare.

risposta

37

Basta usare questo per il tag di chiusura:

@:</tr> 

E lasciare il vostro if/else come è.

Sembra che l'istruzione if non voglia funzionare.

Funziona correttamente. Qui stai lavorando in 2 spazi linguistici, sembra giusto non dividere/aprire i sandwich oltre il confine.

+1

Grazie. Ho provato la soluzione di @ DJQuimby e in qualche modo ha funzionato, ma il resto non era più evidenziato in blu e ho ricevuto questo errore "Il codice ha un carattere di chiusura"} ". Assicurati di avere un carattere"} "corrispondente per tutti" { "caratteri all'interno di questo blocco e nessuno dei caratteri"} "viene interpretato come markup." La tua soluzione ha funzionato, grazie per entrambi i tuoi suggerimenti. –

+1

@Henk Holterman Grazie per la risposta. Ma in Visual Studio se premo ctrl + k + D per allineare il codice, lo riformattiamo come @: ( si sta spostando alla riga successiva). Quindi causando di nuovo lo stesso errore –

+0

ottenuto una correzione per questo Pahul? – CularBytes

9

vorrei solo andare con

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

O ancora meglio

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

questo vi darà linee come

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

Perché hai un tag ''? –

+1

Siamo spiacenti, ho trovato il motivo: https://weblogs.asp.net/scottgu/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax –

5

Un po 'fuori tema, forse, ma per i browser moderni (IE9 e successivi) è possibile utilizzare i selettori pari/dispari per ottenere il risultato desiderato.

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

per sbarazzarsi del caso/imbarazzo altro si potrebbe utilizzare un blocco utilizzando:

@{ 
    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 riutilizzabili che rendono più semplice per aggiungere attributi:

//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)); 
    } 
} 

Metodo di supporto per fare il rasoio syntax clearer:

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