asp.net-mvc - framework - mvc asp net 4




Razor View Engine: looping complesso e HTML (3)

Ho avuto un problema simile - la mia soluzione Html.Raw ("");

    if (isTrue)
    {
        <text><div></text> }
   ...

    if(isTrue) {
        @Html.Raw("</div>"); // <-- closing tag!
        }

Ho un sacco di report HTML complessi nel mio attuale progetto in cui eseguiamo un sacco di rendering condizionale di TR e TD con paniere e colonne.

A volte potrebbe apparire come questo (questo è estremamente semplificato):

<tr>
@foreach (var ourItem in ourList) {
   if (ourItem != ourList.First()) {
      <tr>                
   }
   <td></td>
   </tr>
}

Tuttavia, Razor afferma: "Nel ciclo foreach manca un carattere di chiusura"} ". (all'interno di Visual Studio)

Ho provato a racchiudere il <tr> in <text></text> che fa scomparire il problema di chiusura} solo per trovarlo quando viene eseguito: "Tag di fine incontro" tr "senza tag di inizio corrispondente. etichette finali correttamente bilanciate ".

Come potrei fare questo tipo di rendering condizionale mentre convinco Razor a non preoccuparsi affatto dell'HTML, perché l'HTML è bilanciato quando tutto il ciclo è fatto. O almeno è stato il caso in cui è stato utilizzato il motore di visualizzazione ASP.NET.


Il rasoio dipende dai tag corrispondenti per determinare le transizioni automatiche tra codice e markup. Non è possibile "disabilitare" questa funzione di Razor (almeno non senza riscrivere grandi parti del parser Razor).

Puoi aggirare il problema usando il suggerimento di Darin, anche se non capisco (almeno non dal tuo esempio semplificato) perché la tua vista deve essere così contorta. Perché non scrivere il seguente codice invece:

@foreach (var ourItem in ourList) {
   <tr>
   <td>...</td>
   </tr>
}

Mentre i tag potrebbero bilanciarsi nel markup generato, la fonte che hai fornito rende molto difficile ragionare sulla sua correttezza.


Visual Studio Intellisense e l'evidenziazione della sintassi non sono tra i migliori, ma in questo caso ti avverte che se la condizione non è soddisfatta, potresti ricevere un markup non valido e non dovresti biasimarlo per questo.

La cosa importante è che il tuo progetto funzioni bene, ma potresti considerare di esternalizzare questa logica in helper HTML perché se quello che dici è vero che questa è una versione semplificata di ciò che hai nelle viste non voglio neanche immaginare come il tuo aspetto del codice reale.

L'IMHO che ha una tale logica condizionale è un abuso. Sicuramente dovresti considerare l'utilizzo di helper o controlli HTML come MVCContrib Grid .

AGGIORNARE:

Puoi provare il seguente trucco:

<tr>
@foreach (var ourItem in ourList) {
   if (ourItem != ourList.First()) {
      @:<tr>                
   }
   @:<td></td>
   @:</tr>
}




razor