【问题标题】:Why does Razor not like this?为什么 Razor 不喜欢这样?
【发布时间】:2011-11-07 17:51:52
【问题描述】:

我有一个非常烦人的问题,我有一个看法:

@{

        if(ViewBag.Section == "Home")
        {
           <div id="headerfrontPage">   
        }
        else
        {
            <div id="header">   
        }


     }

我得到一个编译错误:

代码块缺少结束“}”字符。确保你有 此块中所有“{”字符的匹配“}”字符, 并且没有“}”字符被解释为标记。

如何有条件地写一个 div?它基本上是为了破解......

【问题讨论】:

  • Razor 解析器在代码和 html 之间的转换方面非常严格。因为它完全理解你必须通过转换到 html 而不关闭你的块来正确打开/关闭你的元素告诉解析器你仍然在 html 中,所以它忽略了}。做你想做的最干净的方法是@:,它只会把你开始它的那行变成一个html转换。 &lt;text&gt;&lt;/text&gt; 不太清楚,我不会推荐它。
  • 我同意 BuildStarted 和 Andrew Barber 的回答,但我要另外说明,我建议单独计算类名并将其存储在像“headerClass”这样的变量中,然后只写
    .
  • 这是一个非常烦人的问题,似乎没有任何方法可以告诉 Razor“已经关闭该死的块”。如果您只有 1 或 2 行要转义,那么这个问题的答案很好,但我有 15/20 行,我不想全部转义!

标签: c# asp.net-mvc-3 razor


【解决方案1】:

当你包装你的 div 的内部元素时,你可以使用相同的结构:

@if (ViewBag.Section == "Home")
{
    <text><div id="headerfrontPage"></text>
}
else
{
    <text><div id="header"></text>
}

或者你使用剃刀语法@:like

@if (ViewBag.Section == "Home")
{
    @:<div id="headerfrontPage">
}
else
{
    @:<div id="header">
}

但对于您目前的情况,我更喜欢 Ron Sijm 的解决方案:

@{
var divName = ViewBag.Section == "Home" ? "headerfrontPage" : "header";
}

<div id="@divName"> 

【讨论】:

  • 中间部分对我来说非常棒。超级简单,希望我早点想出这个……
【解决方案2】:

我怀疑这是因为你的 div 没有关闭,所以 razor 假设右大括号实际上是 div 内容的一部分。

您可以尝试在那里输出代码中的整个 div 内容,包括结束标记,或者使用 Response.Write 或类似的东西输出 div 标记,这样就不会出现混淆标记。

编辑:另外,也许将您的 div 标签包含在

<text></text>

可能值得一试。

【讨论】:

    【解决方案3】:

    你可以试试这个:

    @{
    string divName;
    
        if(ViewBag.Section == "Home")
        {
           divName = "headerfrontPage";
        }
        else
        {
            divName = "header";
        }
    }
    
    <div id="@divName"> 
    

    我不确定这是否会有所帮助,这是一个很长的路要走。但至少 imo 看起来更好......

    【讨论】:

    • +1 因为我喜欢这种选择属性值的方式,而不是使用的方式。
    【解决方案4】:

    试试这个:

    @if (ViewBag.Section == "Home")
    {
        <text> <div id="headerfrontPage"> </text>
    }
    else
    {
        <text> <div id="header"> </text>
    }
    

    【讨论】:

    • 仍然遇到同样的问题 :-(
    • Exitos 正确地使用了周围的代码块,尽管没有必要。这个答案只是删除了那个块,并不能解决问题。
    【解决方案5】:

    最简单的写法是:

    <div id="@(ViewBag.Section == "Home" ? "headerFrontPage" : "header")">
    

    或者,如果您愿意,可以使用局部变量:

    @{ var headerID = ViewBag.Section == "Home" ? "headerFrontPage" : "header"; }
    
    <div id="@headerID">
    

    关于 Razor 代码块中未闭合标签的更一般情况,您可以explicitly mark the opening tag as content

    @if (ViewBag.Section == "Home")
    {
        @:<div id="headerFrontPage">
    }
    else
    {
        @:<div id="header">
    }
    

    【讨论】:

    • 第一种语法绝对是我的首选方式。我认为这是一个相对较新的 Razor 新增功能(也许它在 MVC3 附带的 Razor 版本中不可用?)
    • @AndrewBarber 有可能!我认为表达式语法已经存在了一段时间——[Scott Gu 在 2010 年提到过][weblogs.asp.net/scottgu/archive/2010/07/02/… 我记得去年使用过它——但以防万一,三元语法也应该有效与Html.Raw。 :)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签