Как пользоваться ? : операторы if с блоками Razor и встроенного кода

154

Я обновляю свои старые представления .aspx новым движком представления Razore. У меня есть несколько мест, где у меня есть такой код:

<span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span>

В идеале я хотел бы сделать это:

<span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span>

Однако здесь есть две проблемы:

  1. vote-up@{puzzle.UserVote .... не рассматривает символ @ как начало блока кода
  2. @puzzle.UserVote == VoteType.Upсмотрит на первую часть так, @puzzle.UserVoteкак будто она должна отображать значение переменной.

Кто-нибудь знает, как решить эти проблемы?

Михей
источник
6
Я не использовал Razor, но, основываясь на том, что я вижу, попробуйте@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt
Так как это лучший результат для встроенных троичных операторов в бритве, я добавлю, что если ваш вывод содержит html или кодируемые символы, такие как апострофы, например, например, вставка @(isSomething ? "class='test'" : "")javascript или аналогичного, он будет кодировать их как объекты, подобные разрывам &#39;страницы. Так что вы должны использовать Html.Raw(".."). В противном случае с приведенным выше кодом вы получите что-то вроде, <p class=&#39;test&#39;>что недопустимо.
NibblyPig

Ответы:

299

Это должно работать:

<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>
CD..
источник
2
очень странно использовать парен, а не скобку
погладить капоцци
32

Ключ заключается в том, чтобы заключить выражение в круглые скобки после @ delimiter. Вы можете заставить любое сложное выражение работать таким образом.

JPC
источник
28
@( condition ? "true" : "false" )
Даниэль Сантос
источник
1
Я пошел на этот, чувствует себя чистым и легко читается позже
Дэн Харрис
1
Если вам нужно отобразить значение свойства (включая строку) вместо вызова ToString () - что не сработало в моем случае. Вы можете сделать это @ (условие? $ "{Foo.bar}": "По умолчанию")
Дэн Харрис
6

В большинстве случаев решение о CD .. будет работать прекрасно. Однако у меня была немного более запутанная ситуация:

 @(String.IsNullOrEmpty(Model.MaidenName) ? "&nbsp;" : Model.MaidenName)

Это напечатало бы меня "& nbsp;" на моей странице соответственно сгенерируйте источник &amp;nbsp;. Теперь есть функция, Html.Raw("&nbsp;")которая должна позволять вам писать исходный код, за исключением того, что в этом созвездии она выдает ошибку компилятора:

Сообщение об ошибке компилятора: CS0173: невозможно определить тип условного выражения, поскольку не существует неявного преобразования между «System.Web.IHtmlString» и «string»

Таким образом, я закончил тем, что написал следующее заявление, которое не так приятно, но работает даже в моем случае:

@if (String.IsNullOrEmpty(Model.MaidenName)) { @Html.Raw("&nbsp;") } else { @Model.MaidenName } 

Примечание: интересно то, что, попав в фигурную скобку, вы должны перезапустить блок Razor.

Дамиан Фогель
источник
Почему бы не просто@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons
Хм .. как насчет из-за вышеупомянутой ошибки компилятора? ;)
Дамиан Фогель
3
Извините, мне нужно больше кофе :)
JP Hellemons
1
Вы можете избежать этой ошибки, сделав обе стороны троичного оператора одного типа,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig