Правильный синтаксис бритвы для оператора switch внутри foreach

У меня есть время, пытаясь найти правильный синтаксис для создания оператора switch внутри цикла foreach на моей странице просмотра mvc.

Вот последняя попытка (после многих других), что я до сих пор, но механизм 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>

    }


......

}

Ответ 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 с 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=).

Ответ 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;
    }

......
}