Konkatenacja Razor ASP.NET MVC

96

Próbuję wyrenderować listę HTML, która wygląda jak poniżej, przy użyciu silnika widoku Razor:

<ul>
  <li id="item_1">Item 1</li>
  <li id="item_2">Item 2</li>
</ul>

Kod, którego próbuję użyć do renderowania tej listy, to:

<ul>
@foreach (var item in Model.TheItems)
{            
  <li id="[email protected]">Item @item.TheItemId</li>
}
</ul>

Parser się dławi, ponieważ uważa, że ​​wszystko na prawo od podkreślenia w atrybucie id jest zwykłym tekstem i nie powinno być analizowane. Nie jestem pewien, jak poinstruować parser, aby renderował TheItemId.

Nie chcę, ale właściwość obiektu modelu, która zawiera prefiks item_.

Muszę również zachować tę składnię, ponieważ używam listy z JQuery Sortable i funkcją serializacji, która wymaga sformatowania atrybutu id w tej składni.

David Marchelya
źródło

Odpowiedzi:

209

Powinieneś owinąć wewnętrzną część połączenia ( ):

<li id="item_@(item.TheItemId)">
Matthew Abbott
źródło
3
Zacząłem od String.Format, ale wolę składnię i zwięzłość Twojej odpowiedzi, oznaczam ją jako moją preferowaną odpowiedź.
David Marchelya,
Używam Visual Studio 2013 i ASP.NET MVC 5, a to nie działa (ciąg jest ustawiony tak , jak jest , łącznie @z nawiasami i nawiasami) ... To, co w końcu zadziałało, było bardzo niezręczne id="foo" + Model.Bar.
Ian Campbell,
To dało mi zmienną w nawiasach. Wygląda na to, że Razor rozumie teraz, że podkreślenie + zmienna = ciąg + zmienna.
Hugh Seagraves
26

A co z użyciem String.Format ? lubię to:

<li id="@String.Format("item_{0}", item.TheItemId)">

Filip Ekberg
źródło
To nie jest poprawnie analizowane z powodu zagnieżdżonych podwójnych cudzysłowów ... czy wewnętrzne cudzysłowy powinny być pojedynczymi cudzysłowami, a zewnętrzne podwójne cudzysłowy, coś w rodzaju id="@String.Format('foo{0}', item.Bar)"?
Ian Campbell,
10

Wolę:

<li id="@String.Concat("item_", item.TheItemId)">

Szczegółowość mówi programistom pomocy technicznej dokładnie, co się dzieje, dzięki czemu jest jasne i łatwe do zrozumienia.

Gary Woodfine
źródło
2

Możesz nawet użyć tego sposobu, aby połączyć więcej ciągów :

<li id="@("item-"+item.Order + "item_"+item.ShopID)" class="ui-state-default"></li>

Oto kolejny post.

Nadzieja pomaga komuś.

shaijut
źródło
0

Ten post wydaje się być starszy, ale teraz działa to teraz w najnowszym MVC:

id="[email protected]"

źródło