Concatenazione Razor ASP.NET MVC


95

Sto provando a eseguire il rendering di un elenco HTML simile al seguente, utilizzando il motore di visualizzazione Razor:

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

Il codice che sto tentando di utilizzare per visualizzare questo elenco è:

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

Il parser sta soffocando, perché pensa che tutto ciò a destra del trattino basso nell'attributo id sia testo normale e non debba essere analizzato. Non sono sicuro di come istruire il parser per eseguire il rendering di TheItemId.

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

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

Risposte:


208

Dovresti racchiudere la parte interna della chiamata con ( ):

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

3
Ho iniziato con String.Format ma preferisco la sintassi e la brevità della tua risposta, lo contrassegno come la mia risposta preferita.
David Marchelya

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

Questo mi ha dato la variabile tra parentesi. Sembra che Razor ora capisca che un trattino basso + una variabile = una stringa + una variabile.
Hugh Seagraves,

26

Che ne dici di usare String.Format ? come questo:

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


Questa non è un'analisi corretta, a causa di virgolette doppie annidate ... le virgolette interne dovrebbero essere virgolette singole e le virgolette doppie esterne, qualcosa di simile id="@String.Format('foo{0}', item.Bar)"?
Ian Campbell

10

Preferisco:

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

La verbosità dice esattamente agli sviluppatori del supporto cosa sta succedendo, quindi è chiara e facile da capire.


2

Puoi anche usare questo modo per concatenare più stringhe :

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

Ecco un altro post.

La speranza aiuta qualcuno.



0

Questo post sembra essere più vecchio ma ora funziona ora nell'ultimo MVC:

id="item_@item.TheItemId"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.