为什么剃刀不喜欢这样

本文关键字:不喜欢 剃刀 为什么 | 更新日期: 2023-09-27 18:13:57

我有一个非常恼人的问题,我有一个视图:

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

     }

我得到一个编译错误:

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

如何有条件地写div?

为什么剃刀不喜欢这样

可以使用相同的结构来包装div的内部元素,如:

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

或者使用razor语法@:,比如

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

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

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

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

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

编辑:也可以在 中包含div标签
<text></text>

也许值得一试

你可以试试:

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

我不确定这是否会有帮助,这是一个很长的机会。但至少在我看来,这看起来更好…

试试这个:

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

最简单的写法是:

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

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

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

对于Razor代码块中未关闭标签的更普遍情况,您可以显式地将开始标签标记为内容:

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