foreach中的switch语句的正确剃刀语法

时间:2013-03-07 22:01:01

标签: asp.net-mvc razor

我正在努力寻找在我的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 个答案:

答案 0 :(得分:18)

你可以像贾斯汀所说的那样做,就像这样:

@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 :(得分:2)

您可以使用Html.Raw方法:

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

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

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

答案 2 :(得分:0)

有时候使用{在一个单独的行中更好。通过这种方法,您可以获得更多代码。另一方面,你得到清晰的html标签行,没有&#34; @:&#34;垃圾。这允许您快速复制粘贴整个html行&#34;按原样#34;在&#34;浏览器中&#34;来自/到真正的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;
    }

......
}

答案 3 :(得分: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>")
}