为什么剃刀不喜欢这个?

时间:2011-11-07 17:51:53

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

我有一个令人讨厌的大问题,我有一个观点:

@{

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


     }

我收到编译错误:

  

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

我如何有条件地写一个div?它基本上是一个黑客......

5 个答案:

答案 0 :(得分:22)

当你将div包含在内部元素中时,你可以使用相同的构造:

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

或者你使用razor syntax @:like

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

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

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

<div id="@divName"> 

答案 1 :(得分:9)

我怀疑是因为你的div没有关闭,所以剃刀假设结束括号实际上是div内容的一部分。

您可以尝试在其中输出代码中的整个div内容,包括结束标记,或者使用Response.Write或类似的东西输出div标记,这样就没有令人困惑的标记。

编辑:也可以将你的div标签包含在

<text></text>

可能值得一试。

答案 2 :(得分:7)

你可以试试这个:

@{
string divName;

    if(ViewBag.Section == "Home")
    {
       divName = "headerfrontPage";
    }
    else
    {
        divName = "header";
    }
}

<div id="@divName"> 

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

答案 3 :(得分:2)

试试这个:

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

答案 4 :(得分:2)

最简单的方法是:

<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">
}