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()">