Простой синтаксис If / Else Razor - PullRequest
35 голосов
/ 15 марта 2012

Я пытаюсь выполнить простое 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>
}
}

Я получаю сообщение об ошибке разбора "Обнаружен конечный тег" tr "без соответствующего начального тега.теги начала / конца правильно сбалансированы? "Похоже, оператор if не хочет работать.

Ответы [ 4 ]

43 голосов
/ 15 марта 2012

Просто используйте это для закрывающего тега:

  @:</tr>

И оставьте свой if / else как есть.

Похоже, оператор if не хочет работать.

Работает нормально.Здесь вы работаете в двух языковых пространствах, и, кажется, не стоит разбивать бутерброды через границу.

10 голосов
/ 15 марта 2012

Я бы просто пошел с

<tr @(if (count++ % 2 == 0){<text>class="alt-row"</text>})>

Или еще лучше

<tr class="alt-row@(count++ % 2)">

это даст вам строки типа

<tr class="alt-row0">
<tr class="alt-row1">
<tr class="alt-row0">
<tr class="alt-row1">
6 голосов
/ 20 ноября 2013

Возможно, немного не по теме, но для современных браузеров (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 */}
1 голос
/ 23 мая 2014

Чтобы избавиться от неловкости if / else, вы можете использовать блок using:

@{
    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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...