2013-03-18 100 views
10

我有我想在剃须刀视图中输出的项目列表。每个项目之间,我想添加一个分隔线,像这样的:通过项目在剃须刀中循环列表并在项目之间添加分隔符

item1 | item2 | item3 

最简单的方法循环是一个foreach:

@foreach(var item in Model.items){ 
    <span>@item.Name</span> | 
} 

很不幸,这增加了额外的分隔线末的名单。有没有简单的方法来跳过这最后的分隔线?

回答

18

您可以使用string.Join

@Html.Raw(string.Join("|", model.Items.Select(s => string.Format("<span>{0}</span>", s.Name)))) 

使用string.Join否定了需要检查的最后一个项目。

可以为更复杂的标记用剃刀@helper方法混合本:

@helper ComplexMarkup(ItemType item) 
{ 
    <span>@item.Name</span> 
} 

@Html.Raw(string.Join("|", model.Items.Select(s => ComplexMarkup(s)))) 

你甚至可以创建一个辅助方法来抽象Html.Raw()string.Join()电话:

public static HtmlString LoopWithSeparator 
    (this HtmlHelper helper, string separator, IEnumerable<object> items) 
{ 
    return new HtmlString 
      (helper.Raw(string.Join(separator, items)).ToHtmlString()); 
} 

用法:

@Html.LoopWithSeparator("|", model.Items.Select(s => ComplexMarkup(s))) 
+0

+1比其他人更优雅... – 2013-03-18 15:30:24

+0

这似乎只适用于非常简单的循环机构。 – Marius 2013-03-18 15:33:43

+0

确实如此,请参阅编辑以改进该前端... – Oliver 2013-03-18 15:37:39

2

不知道这是最简单的方法,还是这些更优雅的方式,但你可以做一些事情;

@foreach (var item in Model.items){ 
    <span>@item.Name</span> @(Model.items[Model.items.Count - 1] != item ? "|" : "") 
} 

因此,您基本上检查item是否是列表中的最后一项。

没有试过这个代码示例,所以你可能需要唠叨它。

2

保留一个计数器变量并在循环中检查它是否是最后一项。

@{ int counter=0; } 
@foreach(var item in Model.items){ 
    counter++; 
    <span>@item.Name</span> 
    if(counter<Model.Items.Count) 
    { 
    @Html.Raw("|") 
    } 
} 

和短版是

@{ int counter=0; } 
@foreach(var item in Model.items){ 
    counter++; 
    <span>@item.Name</span> @(counter< Model.items.Count?"|":"") 
} 
+0

这是我会做,因为我从来没有找到一种方式来获得这样的工作: @for(INT I = 0; Model.items.Count;我++) 很想知道它是如何完成的。 – sanepete 2014-07-05 15:06:02

2

合并这里this article on inline templates其他的答案,我想出了这个helper方法,它可以放在一个扩展类:

public static HelperResult Join<T>(this IEnumerable<T> list, Func<T, HelperResult> template, Func<T, HelperResult> separator) 
{ 
    var first = true; 
    var result = new HelperResult(writer => 
    { 
     foreach (var item in list) 
     { 
      if (first == false) 
       separator(item).WriteTo(writer); 
      first = false; 
      template(item).WriteTo(writer); 
     } 
    }); 

    return result; 
} 

使用的方式那么这将是

@Model.ListOfItems.Join(
    @<a href="@item.Href"> 
     @item.Name 
    </a>, 
    @<text> | </text>) 

这支持HTML中项目和分隔符。

相关问题