嵌套if语句令Razor感到困惑

Der*_*rek 17 c# asp.net-mvc razor

我正在尝试设置一个从Datatable中提取的下拉菜单.这适用于菜单的第一级.

工作代码:

<ul class="dropdown-menu">
@foreach (System.Data.DataRow dr in menu.Rows)
{
    if (Level1 != dr["Level1"].ToString())
    {
        <li><a href="#">@dr["Level1"].ToString()</a></li>
        Level1 = @dr["Level1"].ToString();
    }
}
</ul>
Run Code Online (Sandbox Code Playgroud)

当我尝试添加嵌套的if语句时会发生此问题.如果将此代码放入Visual Studio,您会注意到@foreachRazor无法识别循环的结束括号.

代码中断:

<ul class="dropdown-menu">
@foreach (System.Data.DataRow dr in menu.Rows)
{
    if (Level1 != dr["Level1"].ToString())
    {
        <li><a href="#">@dr["Level1"].ToString()</a></li>
        Level1 = @dr["Level1"].ToString();

        if (Level2 != dr["Level2"].ToString())
        {
            <li><a href="#">@dr["Level2"].ToString()</a></li>
            Level2 = @dr["Level2"].ToString();                                        
        } 
    }
} <!-- the issue is the bracket on this line -->
</ul>
Run Code Online (Sandbox Code Playgroud)

Spl*_*dor 14

您需要将<text>标记中的违规部分包装起来.请参阅此答案:https://stackoverflow.com/a/6099659/1451531


Dav*_*her 5

我认为您不需要在分配值的行前面写@@dr[...]LevelX

<ul class="dropdown-menu">
@foreach (System.Data.DataRow dr in menu.Rows)
{
    if (Level1 != dr["Level1"].ToString())
    {
        <li><a href="#">@dr["Level1"].ToString()</a></li>
        Level1 = dr["Level1"].ToString(); // no need here

        if (Level2 != dr["Level2"].ToString())
        {
            <li><a href="#">@dr["Level2"].ToString()</a></li>
            Level2 = dr["Level2"].ToString();     // and no need here                                   
        } 
    }
} <!-- the issue is the bracket on this line -->
</ul>
Run Code Online (Sandbox Code Playgroud)

编辑

为了解决这个问题,为什么右括号不被识别。

TL;DR
由于您再次处于代码区域,因此不需要@-sign

详细信息
<li>...</li>部分定义了一个html区域,其中文本被解释为html
关闭后,外部代码</li>区域立即再次激活,并且文本被解释为C#代码。因此,可以将其分配给。在这里添加- 符号与在“正常”cs 文件中具有相同的后果: 这是一个语法错误。 Level1@dr