剃刀引擎 - 如何根据不同的条件渲染不同的身体标签?

时间:2011-10-18 19:33:02

标签: asp.net-mvc-3 razor

以下是我目前的代码:

@{
    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 个答案:

答案 0 :(得分:26)

更好的选择可能是在视图顶部声明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">

答案 1 :(得分:7)

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

}

答案 2 :(得分:2)

我还建议通过在页面顶部放置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)上。

[编辑]我忘记了'IE'案例的外部开关语句的中断。 :)

答案 3 :(得分:0)

您打开了很多<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>

<击>

答案 4 :(得分:0)

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