Asp.net mvc 在razor中循环浏览列表并在项目之间添加分隔符

Asp.net mvc 在razor中循环浏览列表并在项目之间添加分隔符,asp.net-mvc,razor,Asp.net Mvc,Razor,我有一个要在razor视图中输出的项目列表。在每个项目之间,我想添加一个分隔行,如下所示: item1 | item2 | item3 循环项目的最简单方法是使用foreach: @foreach(var item in Model.items){ <span>@item.Name</span> | } @foreach(Model.items中的变量项){ @项目名称| } 不幸的是,这在列表的末尾添加了一个额外的分隔符行。有没有跳过最后一行分隔符的简单方法

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

item1 | item2 | item3
循环项目的最简单方法是使用foreach:

@foreach(var item in Model.items){
  <span>@item.Name</span> | 
}
@foreach(Model.items中的变量项){
@项目名称|
}

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

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

@foreach ( var item in Model.items){
    <span>@item.Name</span> @(Model.items[Model.items.Count - 1] != item ? "|" : "")
}
@foreach(Model.items中的变量项){
@item.Name@(Model.items[Model.items.Count-1]!=item?”|“:”)
}
因此,您基本上是在检查
项是否是列表中的最后一项


未尝试此代码示例,因此您可能需要查看它。

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

@{ 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(Model.items中的var项){
计数器++;
@项目名称

如果(计数器您可以使用
string.Join

@Html.Raw(string.Join("|", model.Items.Select(s => string.Format("<span>{0}</span>", s.Name))))
您甚至可以创建一个助手方法来抽象
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());
}

结合这里的其他答案,我提出了这个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;
}
public static HelperResult连接(此IEnumerable列表、Func模板、Func分隔符)
{
var first=真;
var result=new HelperResult(writer=>
{
foreach(列表中的变量项)
{
if(first==false)
分隔符(项目)。写入到(写入器);
第一个=假;
模板(项目).WriteTo(编写器);
}
});
返回结果;
}
使用它的方法是

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

这在项目和分隔符中都支持html。

这似乎只适用于非常简单的循环体。这似乎近乎完美,唯一的问题是它的流动方式;首先定义循环内部,然后定义分隔符,然后定义循环。这是迄今为止最好的一种方式,虽然它不生成html,但只生成文本对不起,我有添加了Html.Raw方法我就是这么做的,因为我从来没有找到一种方法来让这样的东西工作:@for(int I=0;Model.items.Count;I++)很想知道它是怎么做的。Phil Haack也做了类似的事情,所以你有很好的同伴:)。
@Html.LoopWithSeparator("|",  model.Items.Select(s => ComplexMarkup(s)))
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>)