2011-01-16 43 views
78

Estoy intentando el render una lista HTML que se parece a la siguiente, utilizando el motor de vistas Razor:ASP.NET MVC Razor concatenación

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

El código que estoy tratando de utilizar para hacer que esta lista es :

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

el analizador está asfixiando, ya que piensa que todo lo que a la derecha del guión en el atributo id es texto plano y no debe ser analizado. No estoy seguro de cómo ordenar al analizador que muestre 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 serialize que requiere que el atributo id tenga el formato en esta sintaxis.

Respuesta

158

Usted debe envolver la parte interna de la llamada con ():

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

Empecé con String.Format pero prefiero la sintaxis y la brevedad de su respuesta, la estoy marcando como mi respuesta preferida. –

+1

Acabo de pasar por algunas vistas parciales de un compañero de trabajo y limpié todos los String.Formats con este pequeño truco de navaja. ¡Un +1 más obtenido! –

+0

Estoy usando Visual Studio 2013 y ASP.NET MVC 5, y esto no funciona (la cadena se establece * como está *, incluidos los '@' y los paréntesis) ... Lo que finalmente funcionó para mí fue el mismo desvergonzado 'id =" foo "+ Model.Bar'. –

25

¿Qué le parece usar String.Format? de esta manera:

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

+0

String.Format hizo el truco, ¡Gracias! Te estás perdiendo el {0} after item_ en tu respuesta. –

+0

Ops .. :) Disculpa que, cambiado. –

+0

Esto no está analizando correctamente, debido a las comillas dobles anidadas ... si las comillas internas fueran comillas simples y las comillas dobles externas, algo así como 'id =" @ String.Format ('foo {0}', elemento .Bar) "'? –

7

Prefiero:

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

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

0

incluso se puede utilizar de esta manera a concat más cadenas:

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

Here es otro post.

Hope ayuda a alguien.

Cuestiones relacionadas