2012-03-14 116 views
30

我试图做一个简单的if/else内使用此代码一个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> 
} 
} 

我得到一个解析错误“遇到结束标记‘TR’没有匹配的开始标签。您的开始/结束标签是否适当平衡?“似乎if语句不想'工作。

回答

37

就用这个结束标记:

@:</tr> 

,并留下您的if/else原样。

好像if语句不想工作。

它工作正常。你在这里工作在2个语言空间,似乎只适合不在边界上拆开/关闭三明治。

+1

谢谢。我尝试了@ DJQuimby的解决方案,它有点奏效,但其他的不再被突出显示为蓝色,我得到了这个错误“代码块缺少关闭”}“字符。确保你有一个匹配的”}“ “字符,并且没有任何”}“字符被解释为标记。” 虽然你的解决方案工作,谢谢你的两个建议。 – 2012-03-14 21:42:15

+1

@亨克霍特曼感谢您的回答。但在Visual Studio中如果按ctrl + k + D来对齐代码,则将其重新格式化为@:(正在移至下一行)。所以造成同样的错误 – 2015-03-30 13:13:48

+0

得到了一个修复这个Pahul? – CularBytes 2015-12-26 23:43:12

9

我只想与

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

为什么你在那里有一个''标签? – 2017-07-14 05:52:48

+1

对不起,我找到了原因:https://weblogs.asp.net/scottgu/asp-net-mvc-3-razor-s-and-lt-text-gt-syntax – 2017-07-14 05:56:10

5

线,但对于现代浏览器(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 */} 
0

要摆脱的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; 
}