C# 简单的If/Else语法

C# 简单的If/Else语法,c#,asp.net-mvc,razor,html-table,C#,Asp.net Mvc,Razor,Html Table,我试图用以下代码在foreach中执行一个简单的If/Else: @{ var count = 0; foreach (var item in Model) { if (count++ % 2 == 0) { @:<tr class="alt-row"> } else { @:<tr> } <td> @Html.DisplayFor(modelItem =

我试图用以下代码在foreach中执行一个简单的If/Else:

@{
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>
}
}
@{
var计数=0;
foreach(模型中的var项目)
{
如果(计数+++%2==0)
{
@:
}否则{
@:
}
@DisplayFor(modeleItem=>item.Title)
@Html.Truncate(item.Details,75)
i、 IsMain==true).选择(i=>i.Name).Single()
alt=“@item.Images.Where(i=>i.IsMain==true)。选择(i=>i.AltText.Single()”class=“thumb”/>
@ActionLink(“编辑”,“编辑”,新的{id=item.ProjectId})|
@ActionLink(“详细信息”,“详细信息”,新的{id=item.ProjectId})|
@ActionLink(“删除”,“删除”,新的{id=item.ProjectId})
}
}

我得到一个解析错误“遇到结束标记”tr,没有匹配的开始标记。开始/结束标记是否正确平衡?”。似乎if语句不想“起作用”。

只需将此用于结束标记:

  @:</tr>
@:
让你的if/else保持原样

似乎if语句不想“起作用”

这很好。你在两个语言空间工作,似乎不在边界上拆分打开/关闭三明治才合适。

我同意

<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">

可能有点离题,但对于现代浏览器(IE9及更新版本),您可以使用css奇偶选择器来实现所需的功能

tr:nth-child(even) { /* your alt-row stuff */}
tr:nth-child(odd) { /* the other rows */ }


要摆脱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>
        }
    }
}
帮助器方法使razor语法更清晰:

public static TableRow TableRow(this HtmlHelper self, object htmlAttributes)
{
    var tableRow = new TableRow(self, htmlAttributes);
    tableRow.BeginBlock();
    return tableRow;
}

谢谢。我尝试了@DJQuimby的解决方案,它有些效果,但是else不再以蓝色突出显示,我得到了这个错误“代码块缺少一个结束“}”字符。确保此块中的所有“{”字符都有一个匹配的“}”字符,并且“}”字符都没有被解释为标记。“不过,你的解决方案奏效了,谢谢你的两个建议。@Henk Holterman谢谢你的回答。”。但在VisualStudio中,如果我按ctrl+k+D来对齐代码,它会将其重新格式化为@:(移动到下一行)。再次出现同样的错误,这个Pahul得到了修复吗?为什么你在那里有一个
标签?对不起,我发现了原因:这太棒了!只是想加上外括号,使VS指示
if
是“无效表达式项”。所以我把它们取下来:
,它就起作用了。
//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;
}