为什么剃刀不喜欢这个?

Exi*_*tos 16 c# razor asp.net-mvc-3

我有一个巨大的恼人的问题,我有一个观点:

@{

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


     }
Run Code Online (Sandbox Code Playgroud)

我收到编译错误:

代码块缺少结束"}"字符.确保此块中的所有"{"字符都有匹配的"}"字符,并且没有任何"}"字符被解释为标记.

我如何有条件地写一个div?它的基础是hack ...

小智 22

在包装div的内部元素时,可以使用相同的构造,如:

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

或者你使用razor语法@:喜欢

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

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

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

<div id="@divName"> 
Run Code Online (Sandbox Code Playgroud)


And*_*ber 9

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

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

编辑:也可以将你的div标签括在一个

<text></text>
Run Code Online (Sandbox Code Playgroud)

也许值得尝试一下.


Ron*_*ijm 7

你可以试试这个:

@{
string divName;

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

<div id="@divName"> 
Run Code Online (Sandbox Code Playgroud)

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