Razor Engine - как я могу визуализировать теги тела, основанные на разных условиях?

Вот код, который у меня есть:

@{
    if (Request.Browser.Browser == "IE") {
        if (Request.Browser.MajorVersion == 7) { <body class="ie7"> }
        if (Request.Browser.MajorVersion == 8) { <body class="ie8"> }
        if (Request.Browser.MajorVersion == 9) { <body class="ie9"> }
        if (Request.Browser.MajorVersion > 9) { <body> }
    } else {
        <body>
    }
}

Вот ошибка, которую он возвращает, когда браузер пытается ее выполнить:

Сообщение об ошибке Parser: в кодовом блоке отсутствует закрывающий "}" персонаж. Убедитесь, что у вас есть соответствующий символ "}" для всех "{" символов в этом блоке и что ни один из символов "}" интерпретируются как разметка.

Что, черт возьми? Я смог сделать это в стандартном синтаксисе шаблона ASP.NET! Вот как это выглядело:

<% // Adaptation of paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/
   if ( (Request.Browser.Browser == "IE") && (Request.Browser.MajorVersion == 7) ) { %><body class="ie7"><% } %>
<% if ( (Request.Browser.Browser == "IE") && (Request.Browser.MajorVersion == 8) ) { %><body class="ie8"><% } %>
<% if ( (Request.Browser.Browser == "IE") && (Request.Browser.MajorVersion == 9) ) { %><body class="ie9"><% } %>
<% if ( (Request.Browser.Browser == "IE") && (Request.Browser.MajorVersion > 9) ) { %><body><% } %>
<% if   (Request.Browser.Browser != "IE") { %><body><% } %>

Ответ 1

Лучшим вариантом может быть объявление переменной ieClass в верхней части вашего представления, а затем ссылка на нее в теге тела.

@{
    string ieClass = "";
    if (Request.Browser.Browser == "IE") {
        if (Request.Browser.MajorVersion == 7) { ieClass="ie7"; }
        else if (Request.Browser.MajorVersion == 8) { ieClass="ie8"; }
        else if (Request.Browser.MajorVersion == 9) { ieClass="ie9"; }
    }
}

...

<body class="@ieClass">

Ответ 2

@if (Request.Browser.Browser == "IE" || Request.Browser.Browser == "InternetExplorer")
{

}

Ответ 3

Я также рекомендовал бы более чистый подход, поставив код razor/С# в верхней части страницы и используя переменные, чтобы логически назначать значения для использования на вашей странице. Во-первых, он решает проблему с тегами, но также помогает в обслуживании кода.

@{
    string bodyCssClass = string.Empty;
    switch(Request.Browser.Browser)
    {
        case "IE":
            switch(Request.Browser.MajorVersion)
            {
                case 7:
                    bodyCssClass = "browser-ie7";
                    break;
                case 8:
                    bodyCssClass = "browser-ie8";
                    break;
                case 9:
                    bodyCssClass = "browser-ie9";
                    break;
                default:
                    bodyCssClass = "browser-ie6";
            }
            break;
    }
}
<!DOCTYPE html>
<html>
<head>
    <title>@Page.Title</title>
</head>
<body class="@bodyCssClass">
    <div>@RenderBody()</div>
</body>
</html>

Со всем сказанным; если он не доступен для этой страницы, выполненная работа не должна быть на элементе представления (файл cshtml), а скорее из ViewBag (например, ViewBag.BodyCssClass).

[Edit] Я забыл прорыв для внешнего оператора switch для случая "IE".:)

Ответ 4

Вы открываете много тегов <body>, но не закрываете их. Razor "умный", поэтому он запоминает открытые и закрытые теги при разборе.

Вы можете указать бритву игнорировать теги с помощью

  @:<body class="ieX">

если вы избежите последнего <body>, вам также следует избегать тега </body>, например @:</body>. Мой совет - оставить тег <body> как есть.

Но есть и больше.

Ваше форматирование всего на одной линии, вероятно, также путает бритву. Поэтому (не проверено) вам нужно что-то вроде:

if (Request.Browser.MajorVersion == 7) { <text>@:<body class="ie7"></text> }

Если это не работает, отформатируйте его так:

if (Request.Browser.MajorVersion == 7) { 
    @:<body class="ie7">
}

(см. ответ JRummel) <Удаp > И, вероятно, самым простым решением является:

     @{
       var bodyClass = string.Empty;

       if (Request.Browser.MajorVersion == 7) { bodyClass = "ie7"; }
       if (Request.Browser.MajorVersion == 8) { bodyClass = "ie8"; }
       // etc
     }
     <body class="@bodyClass">
     </body>

Забастовкa >

Ответ 5

Ответ JRummel правильный. Чтобы расширить его, я изменил его script, чтобы позволить мне поддерживать более старые версии IE и оставаться обратно совместимыми.

@{
Layout = null;

string ieClass = "";
if (Request.Browser.Browser == "IE")
{
    ieClass += " ie";
    if (Request.Browser.MajorVersion == 9) { ieClass += " lt-ie10"; }
    if (Request.Browser.MajorVersion == 8) { ieClass += " lt-ie9"; }
    if (Request.Browser.MajorVersion == 7) { ieClass = " lt-ie8"; }
}
}
<!doctype html>
<html lang="en-us" dir="ltr" class="no-js @ieClass.Trim()">