Como usar o operador ternário no razor (especificamente em atributos HTML)?

401

Com o mecanismo de exibição WebForms, usarei normalmente o operador ternário para condicionais muito simples, especialmente dentro de atributos HTML. Por exemplo:

<a class="<%=User.Identity.IsAuthenticated ? "auth" : "anon" %>">My link here</a>

O código acima atribuirá à <a>tag uma classe authou anondependendo de o usuário estar autenticado.

Qual é a sintaxe equivalente ao mecanismo de exibição Razor? Como o Razor exige que as tags HTML "saibam" quando entrar e sair do código e da marcação, atualmente estou preso ao seguinte:

@if(User.Identity.IsAuthenticated)  { <a class="auth">My link here</a> }
else { <a class="anon">My link here</a> }

Isto é, para dizer o mínimo, terrível .

Eu adoraria fazer algo assim , mas estou lutando para entender como no Razor:

<a class="@=User.Identity.IsAuthenticated ? "auth" : "anon";">My link here</a>

-

Atualizar:

Enquanto isso, eu criei este HtmlHelper:

public static MvcHtmlString Conditional(this HtmlHelper html, Boolean condition, String ifTrue, String ifFalse)
{
  return MvcHtmlString.Create(condition ? ifTrue : ifFalse);
}

que pode ser chamado assim pelo Razor:

<a class="@Html.Conditional(User.Identity.IsAuthenticated, "auth", "anon")">My link here</a>

Ainda assim, espero que haja uma maneira de usar o operador ternário sem voltar a envolvê-lo em um método de extensão.

Portman
fonte
Assim como uma questão de "Melhor Prática" Eu acredito que você deve estar retornando tipo IHtmlStringcom o método new HtmlString("Some stuff here");para ajudantes etc ...
Justin Soliz
Você faz como stackoverflow.com/questions/6981853/…
Elan Hasson
Por favor vote aqui .
Shimmy Weitzhandler

Respostas:

767

Você deve poder usar a @()sintaxe da expressão:

<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>

Eu não tenho o Razor instalado, então posso estar errado.

David Brown
fonte
60
Aqui está uma referência útil à sintaxe do Razor: Referência rápida da sintaxe do C # Razor
Ryan Lundy
<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> Meu link aqui </a>
BiLaL 6/15
Posso adicionar o operador && nessa lógica?
Alerya
58

Termo aditivo:

O conceito importante é que você está avaliando uma expressão no seu código Razor. A melhor maneira de fazer isso (se, por exemplo, você estiver em um loop foreach), é usando um método genérico.

A sintaxe para chamar um método genérico no Razor é:

@(expression)

Nesse caso, a expressão é:

User.Identity.IsAuthenticated ? "auth" : "anon"

Portanto, a solução é:

@(User.Identity.IsAuthenticated ? "auth" : "anon")

Este código pode ser usado em qualquer lugar do Razor, não apenas para um atributo html.

Consulte o comentário de @Kyralessa para a Referência rápida de sintaxe do C # Razor (blog de Phil Haack).

awrigley
fonte
acabei de notar seu adendo depois de adicionar comentários semelhantes à resposta principal.
Bilal
22

Uma versão mais simples, para olhos fáceis!

@(true?"yes":"no")
Monstros X
fonte
11
isso não é mais simples. que é a mesma resposta com valores diferentes
Dave Rael
4
-1 Dave Rael é certo, este é o mesmo código com valores diferentes
Jacques
6
Isso realmente explica o operador ternário. Portanto, é um bom vício para a solução que não diz onde está o verdadeiro e o falso na condição.
Maurizio Na dinamarca
3
Eu pensei assim. como desenvolvedores, podemos ter respostas claras ... às vezes.
Monsters X
17

Para aqueles que usam o ASP.net com o VB razor, o operador ternário também é possível.

Também deve estar dentro de uma expressão de barbear:

@(Razor_Expression)

e o operador ternário funciona da seguinte maneira:

If(BooleanTestExpression, "TruePart", "FalsePart")

O mesmo exemplo de código mostrado aqui com o VB razor é assim:

<a class="@(If(User.Identity.IsAuthenticated, "auth", "anon"))">My link here</a>

Nota: ao escrever uma TextExpression, lembre-se de que os símbolos booleanos não são os mesmos entre C # e VB.

George_DLJ
fonte
1

no meu problema, quero que o texto da âncora <a>text</a>dentro da minha visão seja baseado em algum valor e que o texto seja recuperadoApp string Resources

então, esta @()é a solução

<a href='#'>
      @(Model.ID == 0 ? Resource_en.Back : Resource_en.Department_View_DescartChanges)
</a>

se o texto não for de App string Resourcesuso este

@(Model.ID == 0 ? "Back" :"Descart Changes")
Basheer AL-MOMANI
fonte
0

Você também pode usar este método:

<input type="text" class="@(@mvccondition ? "true-class" : "false-class")">

Tente isso .. Boa sorte Obrigado.

Arjun
fonte
é necessário adicionar @ com a condição mvc? Acho que não, porque @ já foi usado no início.
Mubashar Shahzad
não é necessário usar @ sob @ ()
Aikansh Mann 18/12/19