Як використовувати ? : якщо висловлювання з блоками 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
Я не користувався бритвою, але виходячи з того, що я бачу, спробуйте@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt

Оскільки це найкращий результат для вбудованих потрійних операторів у бритві, я додам, що якщо ваш висновок містить html або кодовані символи, такі як апострофи, наприклад, @(isSomething ? "class='test'" : "")наприклад, введення javascript чи подібних, він буде кодувати їх як сутності &#39;та розбивати сторінку. Тож треба користуватися Html.Raw(".."). Інакше з наведеним вище кодом ви отримаєте щось <p class=&#39;test&#39;>недійсне.
NibblyPig

Відповіді:


298

Це має працювати:

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

2
дуже дивно використовувати парен, а не дужку
пат capozzi

32

Ключ полягає в інкапсуляції виразу в дужках після роздільника @. Ви можете змусити будь-який складний вираз працювати таким чином.


28
@( condition ? "true" : "false" )

1
Я пішов за цим, відчуває себе чистою і легко читається пізніше
Ден Харріс

1
Якщо вам потрібно відобразити значення властивості (включаючи рядок), а не викликати ToString () - що не працювало в моєму випадку. Ви можете це зробити @ (умова? $ "{Foo.bar}": "За замовчуванням")
Dan Harris

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,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.