14

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

    }


......

}
4

4 回答 4

22

你可以按照贾斯汀的建议做一些事情:

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

    ......
}

但是,如果您使用 Razor V2 运行 MVC4,您可以轻松地使用辅助方法(或常规方法):

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

于 2013-03-07T22:34:57.563 回答
2

您可以使用 Html.Raw 方法:

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

另请参阅MVC3 Razor:在代码块中显示 html以了解其他选项,例如:

    case "New": 
       @:<tr class='info'>
       break;
于 2013-03-07T22:03:43.063 回答
0

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

......
}
于 2017-05-10T18:40:36.133 回答
0

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>")
} 
于 2019-03-25T15:04:34.233 回答