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="item_@item.TheItemId">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.

Respostas:


208

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

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

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)">


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.


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.


1

Você pode fazer isso de uma maneira mais simples:

id="item_@item.TheItemId"

0

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

id="item_@item.TheItemId"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.