Подтвердить что ты не робот

Вложенное выражение if запутывает 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, вы заметите, что закрывающая скобка для цикла @foreach не распознается Razor.

Разрывы кода:

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

Ответ 1

Вам нужно будет обернуть секцию нарушения в тегах <text>. См. Этот ответ: fooobar.com/questions/308523/...

Ответ 2

Я не думаю, что вам нужно написать @ перед @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
Поскольку вы снова в области кода, вам не нужен @ -sign.

Подробнее
Раздел <li>...</li> определяет html-область, где текст интерпретируется как html.
Непосредственно после закрытия </li> активная область внешнего кода снова активна, а текст интерпретируется как С# -code. Поэтому возможно присвоение Level1. Добавление @ -sign в dr здесь имеет те же последствия, что и в "нормальном" cs файле:
Это синтаксическая ошибка.

Ответ 3

В соответствии с этим ответом, если строка интерпретируется как разметка вместо кода, поставьте @перед ней. Если строка интерпретируется как код вместо разметки, поставьте @: перед ней.