12

我有一个要在剃刀视图中输出的项目列表。我想在每个项目之间添加分隔线,如下所示:

item1 | item2 | item3

遍历项目的最简单方法是使用 foreach:

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

不幸的是,这在列表末尾添加了一个额外的分隔线。有没有一种简单的方法可以跳过最后的分隔线?

4

4 回答 4

20

您可以使用string.Join

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

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

您可以将其与 Razor@helper方法混合使用以实现更复杂的标记:

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

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

您甚至可以创建一个辅助方法来抽象Html.Raw()andstring.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)))
于 2013-03-18T15:27:04.823 回答
3

结合这里的其他答案和这篇关于内联模板的文章,我想出了这个帮助方法,它可以放在一个扩展类中:

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。

于 2013-03-19T09:23:45.390 回答
2

不确定这是最简单的方法,还是更优雅的方法,但你可以这样做;

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

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

没有尝试过此代码示例,因此您可能需要对其进行修改。

于 2013-03-18T15:25:26.727 回答
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?"|":"")
 } 
于 2013-03-18T15:26:24.443 回答