Конкатенация Razor ASP.NET MVC

96

Я пытаюсь отобразить список HTML, который выглядит следующим образом, с помощью механизма просмотра Razor:

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

Код, который я пытаюсь использовать для визуализации этого списка:

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

Синтаксический анализатор задыхается, потому что считает, что все справа от подчеркивания в атрибуте id является обычным текстом и не должно анализироваться. Я не знаю, как указать парсеру на рендеринг TheItemId.

Я не хочу, но свойство объекта модели, которое включает префикс item_.

Я также должен сохранить этот синтаксис, поскольку я использую список с JQuery Sortable и с функцией сериализации, которая требует, чтобы атрибут id был отформатирован в этом синтаксисе.

Давид Марчеля
источник

Ответы:

210

Вы должны заключить внутреннюю часть вызова в ( ):

<li id="item_@(item.TheItemId)">
Мэтью Эбботт
источник
3
Я начал с String.Format, но предпочитаю синтаксис и краткость вашего ответа, я отмечу его как свой предпочтительный ответ.
Дэвид Марчеля
Я использую Visual Studio 2013 и ASP.NET MVC 5, и это не работает (строка установлена как есть , включая @скобки и) ... То, что в итоге сработало для меня, было очень некрасивым id="foo" + Model.Bar.
Ян Кэмпбелл
Это дало мне переменную в скобках. Похоже, что Razor теперь понимает, что подчеркивание + переменная = строка + переменная.
Хью
26

Как насчет использования String.Format ? как это:

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

Филип Экберг
источник
Это не выполняется правильно из-за вложенных двойных кавычек ... должны ли внутренние кавычки быть одинарными, а внешние двойные кавычки, что-то вроде id="@String.Format('foo{0}', item.Bar)"?
Ян Кэмпбелл
10

Я предпочитаю:

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

Многословие сообщает разработчикам службы поддержки, что именно происходит, поэтому все ясно и легко для понимания.

Гэри Вудфайн
источник
2

Вы даже можете использовать этот способ для объединения большего количества строк :

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

Вот еще один пост.

Надежда кому-то помогает.

шайджут
источник
1

Вы можете сделать это проще:

id="item_@item.TheItemId"
Анил Шреста
источник
0

Этот пост кажется более старым, но теперь он работает в последней версии MVC:

id="item_@item.TheItemId"

источник