2012-03-14 118 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; 
}