嵌套if语句令Razor感到困惑

时间:2013-04-29 15:49:43

标签: 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>

当我尝试添加嵌套的if语句时,会出现问题。如果将此代码放入Visual Studio,您会注意到Razor无法识别@foreach循环的右括号。

代码中断:

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

3 个答案:

答案 0 :(得分:14)

您需要在<text>标记中包含违规部分。请参阅此答案:https://stackoverflow.com/a/6099659/1451531

答案 1 :(得分:4)

我认为您不需要在@

分配的行中的@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>

修改

要解决这个问题,为什么不能识别结束括号。

<强> TL; DR
由于您在代码区域再次,因此您不需要@ - 签名

<强>详情
<li>...</li>部分定义了 html -region ,其中解释为 html
在结束</li>后,外部代码 - 区域再次处于活动状态,文字解释为 C# -code < / strong>即可。因此,可以分配给Level1。将@ - 符号添加到dr 此处与“普通”cs文件中的后果相同:
这是一个语法错误。

答案 2 :(得分:1)

根据this answer,如果一行被解释为标记而不是代码,则将@放在它前面。如果一行被解释为代码而不是标记,请将@:放在它前面。