web-dev-qa-db-fra.com

Comment utiliser ? : instructions if avec Razor et des blocs de code en ligne

Je mets à jour mes anciennes vues .aspx avec le nouveau moteur de vues Razore. J'ai un tas d'endroits où j'ai un code comme celui-ci:

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

Idéalement, j'aimerais faire ceci:

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

Cependant, il y a deux problèmes ici:

  1. vote-up@{puzzle.UserVote .... ne traite pas le symbole @ comme un début de bloc de code
  2. @puzzle.UserVote == VoteType.Up regarde la première partie @puzzle.UserVote comme s'il était supposé rendre la valeur de la variable.

Quelqu'un sait comment résoudre ces problèmes?

144
Micah

Cela devrait fonctionner:

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

La clé est d'encapsuler l'expression entre parenthèses après le @ délimiteur. Vous pouvez faire en sorte que toute expression composée fonctionne de cette façon.

31
JPC
@( condition ? "true" : "false" )
21
Daniel Santos

Dans la plupart des cas, la solution sur CD .. fonctionnera parfaitement. Cependant, j'ai eu une situation un peu plus tordue:

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

Cela m'imprimerait "nbsp;" dans ma page, générer respectivement la source &amp;nbsp;. Maintenant, il existe une fonction Html.Raw("&nbsp;") qui est supposée vous permettre d'écrire du code source, sauf que dans cette constellation, une erreur de compilation est générée:

Message d'erreur du compilateur: CS0173: Le type de l'expression conditionnelle ne peut pas être déterminé car il n'y a pas de conversion implicite entre 'System.Web.IHtmlString' et 'string'

J'ai donc fini par écrire une déclaration comme celle-ci, moins belle mais qui fonctionne même dans mon cas:

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

Remarque: la chose intéressante est qu'une fois que vous êtes à l'intérieur de l'accolade, vous devez redémarrer un bloc Razor.

3
Damian Vogel