Concatenación de ASP.NET MVC Razor

95

Estoy intentando renderizar una lista HTML que se parece a la siguiente, usando el motor de vista de Razor:

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

El código que estoy intentando usar para representar esta lista es:

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

El analizador se está ahogando porque cree que todo lo que está a la derecha del guión bajo en el atributo id es texto sin formato y no debe analizarse. No estoy seguro de cómo instruir al analizador para que represente TheItemId.

No quiero, sino una propiedad en el objeto modelo que incluye el prefijo item_.

También tengo que mantener esta sintaxis ya que estoy usando la lista con JQuery Sortable y con la función serializar que requiere que el atributo id se formatee en esta sintaxis.

David Marchelya
fuente

Respuestas:

207

Debes envolver la parte interna de la llamada con ( ):

<li id="item_@(item.TheItemId)">
Matthew Abbott
fuente
3
Comencé con String.Format pero prefiero la sintaxis y la brevedad de su respuesta, la estoy marcando como mi respuesta preferida.
David Marchelya
Estoy usando Visual Studio 2013 y ASP.NET MVC 5, y esto no funciona (la cadena está configurada como está , incluidos @y los paréntesis) ... Lo que finalmente funcionó para mí fue lo muy desagradable id="foo" + Model.Bar.
Ian Campbell
Esto me dio la variable entre paréntesis. Parece que Razor ahora entiende que un guión bajo + una variable = una cadena + una variable.
Hugh Seagraves
26

¿Qué tal usar String.Format ? Me gusta esto:

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

Filip Ekberg
fuente
Esto no se está analizando correctamente, debido a las comillas dobles anidadas ... ¿deberían las comillas interiores ser comillas simples y las comillas dobles exteriores, algo así como id="@String.Format('foo{0}', item.Bar)"?
Ian Campbell
10

Yo prefiero:

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

La verbosidad les dice a los desarrolladores de soporte exactamente lo que está sucediendo, por lo que es claro y fácil de entender.

Gary Woodfine
fuente
2

Incluso puede usar esta forma para concatizar más cadenas :

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

Aquí hay otra publicación.

La esperanza ayuda a alguien.

shaijut
fuente