foreach内部switch语句的正确的剃须刀语法

问题描述:

我有一段时间试图找到正确的语法在我的mvc视图页面上的foreach循环内创建一个switch语句。foreach内部switch语句的正确的剃须刀语法

这是迄今为止最新的尝试(在许多人之后),但是Razor引擎不会接受它。这里的错误是正确的@foreach,并表示它缺少结束}

@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

它不适合你的最可能的原因是Razor只能在标签格式良好并关闭时自动执行C#/ HTML检测。如果您只想打开标记,则必须使用其他响应者显示的“@:”语法。 – Eilon 2013-03-07 22:50:56

+0

这仅仅是个人的事情,但是我不久前在Views中停止使用switch语句,因为它真的会增加可读性。辅助方法会更好。在附注中,最好使用类似'Html.Raw'或'MvcHtmlString.Create'的东西,因为Razor可能会抛出警告,因为它找不到结束标签。 – Silvermind 2013-03-07 22:52:57

你可以像贾斯汀建议的那样做:

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

    ...... 
} 

但是,如果你正在运行MVC4 with Razor V2,你可以简单地使用一个辅助方法(或常规方法),而不是:

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. 
     } 
    } 
} 

,然后用它像这样:

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

    ..... 
} 

这是更可读和更容易维护。如果GetCssClass()方法返回null,则Razor V2甚至不会呈现该属性(在本例中为class=)。

+1

什么是放置MyHelperExtensions文件的最佳文件夹?谢谢! – ChiliYago 2013-03-08 17:43:12

+2

@ChiliYago我通常会在根目录下创建一个名为* Helpers *或* Extensions *的文件夹。另外不要忘记在* Views \ Web.config * - >'中添加MyHelperExtensions类的名称空间',以便它在您的视图中自动显示。 – 2013-03-08 19:36:51

你可以使用Html.Raw方法:

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

另见MVC3 Razor: Displaying html within code blocks其他选项,例如:

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

有时候最好使用{在一个单独的行中。用这种方法你可以得到更多的代码。另一方面,您可以清楚地看到没有“@:”垃圾的html标签。这允许您在“浏览器内”调试期间,将整个html行按照“原样”快速复制粘贴到真正的html中。

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

...... 
}