【问题标题】:proper razor syntax for switch statement inside foreachforeach 中 switch 语句的正确剃刀语法
【发布时间】:2013-03-07 22:01:00
【问题描述】:

我花了很长时间试图找到在我的 mvc 视图页面上的 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>

    }


......

}

【问题讨论】:

  • 它不适合您的最可能原因是 Razor 只能在标签格式正确且关闭时进行自动 C#/HTML 检测。如果您只想要一个开放标签,则必须使用其他响应者显示的“@:”语法。
  • 这只是个人的事情,但我不久前就停止在 Views 中使用 switch 语句,因为它真的会破坏可读性。辅助方法会更好。附带说明一下,最好使用 Html.RawMvcHtmlString.Create 之类的东西,因为 Razor 可能会抛出警告,因为它找不到结束标签。

标签: asp.net-mvc razor


【解决方案1】:

你可以按照贾斯汀的建议,采取以下方式:

@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=)。

【讨论】:

  • 放置 MyHelperExtensions 文件的最佳文件夹是什么?谢谢!
  • @ChiliYago 我通常在根目录中创建一个名为 HelpersExtensions 的文件夹。另外不要忘记在 Views\Web.config -> &lt;configuration&gt;&lt;system.web.webPages.razor&gt;&lt;pages pageBaseType="System.Web.Mvc.WebViewPage"&gt;&lt;namespaces&gt; 中为 MyHelperExtensions 类添加命名空间,以便它自动显示在您的视图中。
【解决方案2】:

您可以使用 Html.Raw 方法:

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

另请参阅MVC3 Razor: Displaying html within code blocks 了解其他选项,例如:

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

【讨论】:

    【解决方案3】:

    有时最好在单独的行中使用 {。使用这种方法,您可以获得更多代码行。另一方面,您会得到清晰的 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;
        }
    
    ......
    }
    

    【讨论】:

      【解决方案4】:

      ASP NET CORE 2.2 MVC 的变体

      @foreach (var item in Model) {
      
          String s = item.RegistrationStatus.ToString();
      
          // Make sure this mirrors values in RegistrationStatus enum!
          switch (s)
          {
              case "New":
                  @Html.Raw("<tr class='info'>")
                  break;
      
              case "Arrived":
                  @Html.Raw("<tr class='success'>")
                  break;
      
              default:
                  @Html.Raw("<tr>")
                  break;
          }
      
          ......
          @Html.Raw("/<tr>")
      } 
      

      【讨论】:

      • 这不足以作为答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多