Синтаксис Simple If/Else Razor
Я пытаюсь сделать простой If/Else внутри foreach с помощью этого кода:
@{
var count = 0;
foreach (var item in Model)
{
if (count++ % 2 == 0)
{
@:<tr class="alt-row">
} else {
@:<tr>
}
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.Truncate(item.Details, 75)
</td>
<td>
<img src="@Url.Content("~/Content/Images/Projects/")@item.Images.Where(i => i.IsMain == true).Select(i => i.Name).Single()"
alt="@item.Images.Where(i => i.IsMain == true).Select(i => i.AltText).Single()" class="thumb" />
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ProjectId }) |
@Html.ActionLink("Details", "Details", new { id = item.ProjectId }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ProjectId })
</td>
</tr>
}
}
Я получаю ошибку синтаксического анализа "Encounted end tag" tr "без соответствующего начального тега. Правильно ли сбалансированы ваши начальные и конечные теги?". Кажется, что оператор if не хочет работать.
Ответы
Ответ 1
Просто используйте это для закрывающего тега:
@:</tr>
И оставьте ваш if/else как есть.
Похоже, что оператор if не хочет работать.
Он отлично работает. Вы работаете в двух языковых пространствах здесь, кажется, что правильно не разделить открытые/закрытые бутерброды над границей.
Ответ 2
Я бы просто пошел с
<tr @(if (count++ % 2 == 0){<text>class="alt-row"</text>})>
Или даже лучше
<tr class="[email protected](count++ % 2)">
это даст вам строки типа
<tr class="alt-row0">
<tr class="alt-row1">
<tr class="alt-row0">
<tr class="alt-row1">
Ответ 3
Немного от темы, может быть, но для современных браузеров (IE9 и новее) вы можете использовать css нечетные/четные селекторы для достижения желаемого.
tr:nth-child(even) { /* your alt-row stuff */}
tr:nth-child(odd) { /* the other rows */ }
или
tr { /* all table rows */ }
tr:nth-child(even) { /* your alt-row stuff */}
Ответ 4
Чтобы избавиться от неудобства if/else, вы можете использовать используемый блок:
@{
var count = 0;
foreach (var item in Model)
{
using(Html.TableRow(new { @class = (count++ % 2 == 0) ? "alt-row" : "" }))
{
<td>
@Html.DisplayFor(modelItem => item.Title)
</td>
<td>
@Html.Truncate(item.Details, 75)
</td>
<td>
<img src="@Url.Content("~/Content/Images/Projects/")@item.Images.Where(i => i.IsMain == true).Select(i => i.Name).Single()"
alt="@item.Images.Where(i => i.IsMain == true).Select(i => i.AltText).Single()" class="thumb" />
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id=item.ProjectId }) |
@Html.ActionLink("Details", "Details", new { id = item.ProjectId }) |
@Html.ActionLink("Delete", "Delete", new { id=item.ProjectId })
</td>
}
}
}
Повторяемый элемент, который упрощает добавление атрибутов:
//Block is take from http://www.codeducky.org/razor-trick-using-block/
public class TableRow : Block
{
private object _htmlAttributes;
private TagBuilder _tr;
public TableRow(HtmlHelper htmlHelper, object htmlAttributes) : base(htmlHelper)
{
_htmlAttributes = htmlAttributes;
}
public override void BeginBlock()
{
_tr = new TagBuilder("tr");
_tr.MergeAttributes(HtmlHelper.AnonymousObjectToHtmlAttributes(_htmlAttributes));
this.HtmlHelper.ViewContext.Writer.Write(_tr.ToString(TagRenderMode.StartTag));
}
protected override void EndBlock()
{
this.HtmlHelper.ViewContext.Writer.Write(_tr.ToString(TagRenderMode.EndTag));
}
}
Помощник для улучшения четкости синтаксиса бритвы:
public static TableRow TableRow(this HtmlHelper self, object htmlAttributes)
{
var tableRow = new TableRow(self, htmlAttributes);
tableRow.BeginBlock();
return tableRow;
}