通过在剃刀列表循环和添加项目之间的分隔符(Looping through a list in raz

2019-07-21 21:41发布

我有我想要的Razor视图输出项目的列表。 每个项目之间,我想添加一个分隔线,就像这样:

item1 | item2 | item3

通过项目环最简单的方法是用一个foreach:

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

不幸的是,这增加在列表的最后一个额外的分隔线。 有没有一种简单的方法来跳过最后分隔线?

Answer 1:

您可以使用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)))


Answer 2:

在这里结合其他答案这篇文章联模板 ,我想出了这个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。



Answer 3:

不知道这是最简单的办法,或者,如果这些是一个更优雅的方式,但你可以做这样的事情;

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

所以你基本上是检查是否该item是在列表中的最后一项。

没有尝试过此代码示例,所以你可能需要tweek它。



Answer 4:

保留一个计数器变量和内环路,并检查它是否是最后一个项目或没有。

@{ 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?"|":"")
 } 


文章来源: Looping through a list in razor and adding a separator between items