Razor Engine - Как я могу визуализировать различные теги тела в зависимости от условий? - PullRequest
11 голосов
/ 18 октября 2011

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

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

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

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

Какого черта? Я смог сделать это в стандартном синтаксисе шаблонов 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><% } %>

Ответы [ 5 ]

26 голосов
/ 18 октября 2011

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

@{
    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">
7 голосов
/ 30 апреля 2015
@if (Request.Browser.Browser == "IE" || Request.Browser.Browser == "InternetExplorer")
{

}
2 голосов
/ 19 октября 2011

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

@{
    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'.:)

0 голосов
/ 06 августа 2014

JRummel ответ правильный.Чтобы расширить его, я изменил его скрипт, чтобы позволить мне поддерживать более старые версии 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()">
0 голосов
/ 18 октября 2011

Вы открываете много тегов <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) И, вероятно, самое простое решение:

     @{
       var bodyClass = string.Empty;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...