2013-03-07 15 views
11

Sto provando un po 'di tempo cercando di trovare la sintassi corretta per creare un'istruzione switch all'interno di un ciclo foreach sulla mia pagina di visualizzazione di mvc.sintassi del rasoio corretta per l'istruzione switch all'interno di foreach

Ecco l'ultimo tentativo (dopo molti altri) che ho finora ma il motore Razor non lo accetterà. Qui l'errore è proprio al @foreach e indica che manca una chiusura }

@foreach (var item in Model) { 

    String s = item.RegistrationStatus.ToString(); 

    // Make sure this mirrors values in RegistrationStatus enum! 
    switch (s) 
    { 
     case "New": 
      <tr class='info'> 
       break; 

     case "Arrived": 
      <tr class='success'> 
      break; 

     default: 
      <tr> 

    } 


...... 

} 
+0

Il motivo più probabile per cui non funziona è che Razor può solo eseguire il rilevamento automatico C#/HTML quando i tag sono ben formati e chiusi. Se si desidera solo un tag aperto, è necessario utilizzare la sintassi "@: " mostrata dagli altri risponditori. – Eilon

+0

È solo una cosa personale, ma ho smesso di usare le istruzioni switch in Views qualche tempo fa, dato che compromette la leggibilità. Un metodo di supporto sarebbe meglio imo. In una nota a margine, è anche meglio usare qualcosa come 'Html.Raw' o' MvcHtmlString.Create' perché Razor potrebbe lanciare avvertimenti perché non riesce a trovare i tag di chiusura. – Silvermind

risposta

14

Si può fare come suggerisce Justin, qualcosa in questo senso:

@foreach (var item in Model) { 

    String s = item.RegistrationStatus.ToString(); 

    // Make sure this mirrors values in RegistrationStatus enum! 
    switch (s) 
    { 
     case "New": 
      @:<tr class='info'> 
      break; 

     case "Arrived": 
      @:<tr class='success'> 
      break; 

     default: 
      @:<tr> 
      break; 
    } 

    ...... 
} 

Ma, se si sta eseguendo MVC4 with Razor V2, come si potrebbe facilmente utilizzare un metodo di supporto (o il metodo normale) invece:

public static class MyHelperExtensions 
{ 
    public static string GetCssClass(this HtmlHelper helper, RegistrationStatus status) 
    { 
     // Make sure this mirrors values in RegistrationStatus enum! 
     switch (status) 
     { 
      case RegistrationStatus.New: 
       return "info"; 

      case RegistrationStatus.Arrived: 
       return "success"; 

      default: 
       return null; // Return null so that the attribute won't render. 
     } 
    } 
} 

e quindi utilizzarlo in questo modo:

@foreach (var item in Model) 
{  
    <tr class='@Html.GetCssClass(item.RegistrationStatus)'> 

    ..... 
} 

Questo è un po 'più leggibile e più facile da mantenere. Se il metodo GetCssClass() restituisce null, Razor V2 non renderà nemmeno l'attributo (in questo caso class=).

+1

Qual è la migliore cartella in cui inserire il file MyHelperExtensions? Grazie! – ChiliYago

+2

@ChiliYago Di solito creo una cartella denominata * Helpers * o * Extensions * nella root. Inoltre, non dimenticare di aggiungere lo spazio dei nomi per la classe 'MyHelperExtensions' in * Views \ Web.config * ->' ' in modo che venga visualizzato automaticamente nelle visualizzazioni. –

2

Si potrebbe utilizzare il metodo Html.Raw:

case "New": 
     Html.Raw("<tr class='info'>") 
     break; 

vedono anche MVC3 Razor: Displaying html within code blocks per altre opzioni come ad esempio:

case "New": 
     @:<tr class='info'> 
     break; 
0

A volte è meglio usare {in una riga separata. Con questo approccio ottieni più linee di codice. D'altra parte, si ottengono linee chiare di tag html senza "@:" garbage. Ciò consente di copiare e incollare rapidamente intere linee html "così come sono" da/a un vero html durante il debug "in-browser".

@foreach (var item in Model) { 
    String s = item.RegistrationStatus.ToString(); 

    // Make sure this mirrors values in RegistrationStatus enum! 
    switch (s) 
    { 
     case "New": 
     { 
      <tr class='info'> 
     } 
      break; 
     case "Arrived": 
     { 
      <tr class='success'> 
     } 
      break; 
     default: 
     { 
      <tr> 
     } 
      break; 
    } 

...... 
} 
Problemi correlati