我正在尝试设置一个从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>
答案 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,如果一行被解释为标记而不是代码,则将@放在它前面。如果一行被解释为代码而不是标记,请将@:放在它前面。