ASP.NET MVC Razor Concatenation

95

Estou tentando renderizar uma lista HTML que se parece com o seguinte, usando o mecanismo de visualização Razor:

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

O código que estou tentando usar para renderizar esta lista é:

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

O analisador está sufocando, porque ele pensa que tudo à direita do sublinhado no atributo id é texto simples e não deve ser analisado. Não tenho certeza de como instruir o analisador a renderizar TheItemId.

Eu não quero, mas uma propriedade no objeto de modelo que inclui o prefixo item_.

Eu também tenho que manter essa sintaxe, pois estou usando a lista com JQuery Sortable e com a função serializar que requer que o atributo id seja formatado nesta sintaxe.

David Marchelya
fonte

Respostas:

208

Você deve encerrar a parte interna da chamada com ( ):

<li id="item_@(item.TheItemId)">
Matthew Abbott
fonte
3
Comecei com String.Format, mas prefiro a sintaxe e a brevidade de sua resposta, estou marcando-a como minha resposta preferida.
David Marchelya
Estou usando o Visual Studio 2013 e a ASP.NET MVC 5, e isso não está funcionando (a string está definida como está , incluindo o @e os parênteses) ... O que finalmente funcionou para mim foi o muito desagradável id="foo" + Model.Bar.
Ian Campbell
Isso me deu a variável entre parênteses. Parece que o Razor agora entende que um sublinhado + uma variável = uma string + uma variável.
Hugh Seagraves
26

Que tal usar String.Format ? como isso:

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

Filip Ekberg
fonte
Isso não está sendo analisado corretamente devido a aspas duplas aninhadas ... as aspas internas devem ser aspas simples e as externas duplas, algo como id="@String.Format('foo{0}', item.Bar)"?
Ian Campbell
10

Eu prefiro:

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

O detalhamento diz aos desenvolvedores de suporte exatamente o que está acontecendo, então é claro e fácil de entender.

Gary Woodfine
fonte
2

Você pode até usar essa maneira para concatear mais strings :

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

Aqui está outro post.

A esperança ajuda alguém.

shaijut
fonte
0

Esta postagem parece ser mais antiga, mas agora funciona no MVC mais recente:

id="[email protected]"

fonte