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

Кажется, что не удалось создать новую строку таблицы, используя инструкции Razor foreach и if?

Я хочу, чтобы цикл динамически создавал таблицу шириной до 2 колонок, а затем увеличивал количество строк до тех пор, пока в списке не останется записей. Звучит просто, и я придумал это:

<table>
                    <tr>
                        @{ var i = 0; }
                        @foreach (var tm in Model.TeamMembers)
                        {
                            <td>@tm.FirstName @tm.LastName @tm.Role</td>

                            if(++i % 2 == 0)
                            {
                                </tr>
                                <tr>
                            }
                        }
                    </tr>
                </table>

Но я получаю сообщения об ошибках, ожидающие как для цикла for, так и для оператора if. Если я изменю теги на что-то другое (например, например), он отлично работает.

Я предполагаю, что он пытается проверить конец строки, видит ее и решает, что цикл должен быть закончен? Как я могу сделать это НЕ делать, или мне нужно положить всю таблицу внутри цикла с кучей грязных условностей?: (

4b9b3361

Ответ 1

Попробуйте вот так:

@{ var i = 0; }
@foreach (var tm in Model.TeamMembers)
{
    <td>@tm.FirstName @tm.LastName @tm.Role</td>
    if(++i % 2 == 0)
    {
        <text></tr><tr></text>
    }
}

или

@{ var i = 0; }
@foreach (var tm in Model.TeamMembers)
{
    <td>@tm.FirstName @tm.LastName @tm.Role</td>
    if(++i % 2 == 0)
    {
        @:</tr><tr>
    }
}

Ответ 2

Razor ожидает, что код HTML, следующий за вашим кодом С#, будет заключен в пару тэгов html. Здесь у вас есть конечный тег в первую очередь, а начальный тег - позже, почему бритву не удалось разобрать текст.

Включение вашего кода HTML-кода в решает эту проблему, как указал Дарин.

Вы можете прочитать это краткое руководство Phil Haacked http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx

Ответ 3

В синтаксисе Razor вы можете использовать @: Вставить литерал.

@:This allows literal text & arbitrary html 

Вы можете увидеть, как это реализовано в моем решении, опубликованном ниже. Он правильно закрывает таблицу с правильным количеством ячеек таблицы в строке.

Мне нужен табличный список переключателей со способностью привязывать выбранное значение.

@{
   int iSelectedId = (int)ViewData["SelectedMember"];
   long iCols = 3;
   long iCount = Model.TeamMembers.Count();
   long iRemainder = iCount % iCols;                    
   decimal iDiv = iCount / repeatCols;                    
   var iRows = Math.Ceiling(iDiv);
}
<table>
  <tr>
    @for (int i = 0; i < iCount; i++)
    {
      var tm = Model.TeamMembers[i];
      <td><input type="radio" name="item" value="@(tm.Id)" @(tm.Id == iSelectedId) ? "checked=checked" : "") /> @(tm.FirstName) @(tm.LastName)) - @(tm.Role) </td> 

      if (i % iCols == iCols -1 && i < iCount - 1) 
      { 
        //The alternate syntax for adding arbitrary text/html @: 
        //was crucial in getting this to work correctly.
        @:</tr><tr>
      }
    }
    if (iRem > 0) 
    {
      <td colspan="@(iCols - iRem)">&nbsp;</td>
    }
  </tr>
</table>