2011-01-16 8 views
78

Sto cercando la rendono una lista HTML che sia simile alla seguente, utilizzando il motore di visualizzazione Razor:ASP.NET MVC Razor concatenazione

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

Il codice che sto tentando di utilizzare per il rendering questa lista è :

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

il parser sta soffocando, perché pensa che che tutto alla destra della sottolineatura nel attributo id è il testo normale e non deve essere analizzato. Sono incerto su come istruire il parser per rendere TheItemId.

Non voglio ma una proprietà sull'oggetto modello che include il prefisso item_.

Devo anche mantenere questa sintassi mentre sto usando l'elenco con JQuery Sortable e con la funzione serialize che richiede che l'attributo id sia formattato in questa sintassi.

risposta

158

Si dovrebbe avvolgere la parte interna della chiamata con ():

<li id="[email protected](item.TheItemId)"> 
+3

Ho iniziato con String.Format ma preferisco la sintassi e la brevità della risposta, la contrassegnerò come la mia risposta preferita. –

+1

Ho appena esaminato alcune viste parziali di un collega e ripulito tutti gli String.Formats con questo piccolo trucco da barba. Il più guadagnato +1! –

+0

Sto usando Visual Studio 2013 e ASP.NET MVC 5, e questo non funziona (la stringa è impostata * così com'è *, incluso '@' e le parentesi) ... Ciò che alla fine ha funzionato per me è stato proprio ungraceful 'id =" foo "+ Model.Bar'. –

25

Che ne dici di utilizzare String.Format? in questo modo:

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

+0

String.Format ha fatto il trucco, grazie! Ti manca solo {0} dopo l'elemento_ nella tua risposta. –

+0

Ops .. :) Scusate, cambiato. –

+0

Questo non sta analizzando correttamente, a causa di virgolette nidificate ... se le virgolette interne sono virgolette singole e virgolette esterne, qualcosa come 'id =" @ String.Format ('foo {0}', elemento .Bar) "'? –

7

preferisco:

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

La verbosità racconta gli sviluppatori di supporto esattamente ciò che è sta succedendo, quindi è chiaro e facile da capire.

0

si può anche utilizzare in questo modo per concat più stringhe:

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

Here è un altro post.

La speranza aiuta qualcuno.