2013-03-18 23 views
10

Jilet görünümünde çıktısını almak istediğim öğelerden oluşan bir liste var. Her öğe Arasında Bunun gibi bir ayırıcı çizgi eklemek istiyorum:Usturadaki bir listeden geçerek öğeler arasında bir ayırıcı ekleme

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

Ne yazık ki bu sonunda fazladan bir ayırıcı çizgi ekler:

item1 | item2 | item3 

basit yolu döngü öğeler arasında bir foreach ile listenin Bu son ayırıcı çizgiyi atlamanın basit bir yolu var mı?

cevap

18

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

ve kısa versiyonudur.

Sen daha karmaşık biçimlendirme için bir Razor @helper yöntemi ile bu karıştırabilirsiniz:

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

Kullanımı:

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

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

Hatta soyut bir yardımcı yöntemi Html.Raw() ve string.Join() aramalar oluşturabilir

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

+1 diğerlerinden daha zarif ... –

+0

Bu sadece çok basit döngü gövdeleri için uygun görünüyor. – Marius

+0

Doğru, o ön kısımda iyileştirme için düzenlemeye bakın ... – Oliver

2

Bunun en basit yol olup olmadığından veya bunların daha zarif bir yol olup olmadığından emin değilsiniz;

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

Yani kısaca item listedeki son öğe olup olmadığını görmek için kontrol ediyoruz.

Bu kod örneğini denemediniz, bu nedenle ara vermeniz gerekebilir.

2

Sayıcı değişkeni içinde ve döngü içinde tutup son öğenin olup olmadığını kontrol edin.

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

string.Join kullanılması son öğe denetlemek için gereksinimini ortadan kaldırır: Sen string.Join kullanabilirsiniz

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

Bu işe böyle bir şey almak için bir yol bulamadılar çünkü ben yaparım nasıl: isterim @for (i ++;; Model.items.Count i = 0 int) nasıl yapıldığını biliyorum. – sanepete

2

o zaman bu yer html destekleyen

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

olacağını

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; 
} 

kullanmak yolu: Burada this article on inline templates ile diğer cevaplar, ben bir uzantısı sınıfında konabilir bu yardımcı yöntemiyle, ile geldi hem eşya hem de ayırıcı.

İlgili konular