Concaténation de rasoir ASP.NET MVC

95

J'essaie de rendre une liste HTML qui ressemble à ce qui suit, en utilisant le moteur de vue Razor:

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

Le code que j'essaie d'utiliser pour rendre cette liste est:

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

L'analyseur est en train d'étouffer, car il pense que tout ce qui se trouve à droite du trait de soulignement dans l'attribut id est du texte brut et ne doit pas être analysé. Je ne sais pas comment demander à l'analyseur de rendre TheItemId.

Je ne veux pas mais une propriété sur l'objet modèle qui inclut le préfixe item_.

Je dois également conserver cette syntaxe car j'utilise la liste avec JQuery Sortable et avec la fonction de sérialisation qui nécessite que l'attribut id soit formaté dans cette syntaxe.

David Marchelya
la source

Réponses:

208

Vous devez envelopper la partie interne de l'appel avec ( ):

<li id="item_@(item.TheItemId)">
Matthew Abbott
la source
3
J'ai commencé avec String.Format mais je préfère la syntaxe et la brièveté de votre réponse, je la marque comme ma réponse préférée.
David Marchelya
J'utilise Visual Studio 2013 et ASP.NET MVC 5, et cela ne fonctionne pas (la chaîne est définie telle@ quelle , y compris le et les parenthèses) ... Ce qui a finalement fonctionné pour moi était le très ingrat id="foo" + Model.Bar.
Ian Campbell
Cela m'a donné la variable entre parenthèses. Il semble que Razor comprend maintenant qu'un trait de soulignement + une variable = une chaîne + une variable.
Hugh Seagraves
26

Que diriez-vous d'utiliser String.Format ? comme ça:

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

Filip Ekberg
la source
Ce n'est pas une analyse correcte, en raison de doubles guillemets imbriqués ... les guillemets intérieurs doivent-ils être des guillemets simples et les guillemets doubles externes, quelque chose comme id="@String.Format('foo{0}', item.Bar)"?
Ian Campbell
10

Je préfère:

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

La verbosité indique aux développeurs de support exactement ce qui se passe, donc c'est clair et facile à comprendre.

Gary Woodfine
la source
2

Vous pouvez même utiliser cette méthode pour concater plus de chaînes :

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

Voici un autre article.

L'espoir aide quelqu'un.

shaijut
la source
0

Cet article semble être plus ancien, mais cela fonctionne maintenant dans le dernier MVC:

id="[email protected]"

la source