Кажется, что не удалось создать новую строку таблицы, используя инструкции 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. Если я изменю теги на что-то другое (например, например), он отлично работает.
Я предполагаю, что он пытается проверить конец строки, видит ее и решает, что цикл должен быть закончен? Как я могу сделать это НЕ делать, или мне нужно положить всю таблицу внутри цикла с кучей грязных условностей?: (
Ответы
Ответ 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)"> </td>
}
</tr>
</table>