Come utilizzare l'operatore ternario nel rasoio (in particolare sugli attributi HTML)?


401

Con il motore di visualizzazione WebForms, userò comunemente l'operatore ternario per condizioni molto semplici, specialmente all'interno degli attributi HTML. Per esempio:

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

Il codice precedente fornirà al <a>tag una classe autho in anonbase al fatto che l'utente sia autenticato.

Qual è la sintassi equivalente con il motore di visualizzazione Razor? Poiché Razor richiede tag HTML per "sapere" quando saltare dentro e fuori il codice e il markup, al momento sono bloccato con quanto segue:

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

Questo è, per dirla in parole povere, terribile .

Mi piacerebbe fare qualcosa del genere , ma faccio fatica a capire come in Razor:

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

-

Aggiornare:

Nel frattempo, ho creato questo HtmlHelper:

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

che può essere chiamato così da Razor:

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

Spero comunque che ci sia un modo per usare l'operatore ternario senza ricorrere al suo avvolgimento in un metodo di estensione.


Proprio per "Best Practice" credo che dovresti tornare a scrivere IHtmlStringcon il metodo new HtmlString("Some stuff here");per gli aiutanti, ecc ...
Justin Soliz,


Per favore, vota qui .
Shimmy Weitzhandler,

Risposte:


767

Dovresti essere in grado di utilizzare la @()sintassi dell'espressione:

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

Non ho installato Razor, quindi potrei sbagliarmi.


60
Ecco un utile riferimento alla sintassi del rasoio: Guida rapida
Ryan Lundy,

<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> Il mio link qui </a>
BiLaL

Posso aggiungere l'operatore && in questa logica?
alerya,

58

Addendum:

Il concetto importante è che stai valutando un'espressione nel tuo codice Razor. Il modo migliore per farlo (se, ad esempio, ti trovi in ​​un ciclo foreach) sta usando un metodo generico.

La sintassi per chiamare un metodo generico in Razor è:

@(expression)

In questo caso, l'espressione è:

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

Pertanto, la soluzione è:

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

Questo codice può essere utilizzato ovunque in Razor, non solo per un attributo html.

Vedi il commento di @Kyralessa per la Guida rapida alla sintassi del rasoio C # (blog di Phil Haack).


ho appena notato il tuo addendum dopo aver aggiunto commenti simili alla risposta principale.
BiLaL,

22

Una versione più semplice, per occhi facili!

@(true?"yes":"no")

11
non è più semplice. questa è la stessa risposta con valori diversi
Dave Rael il

4
-1 Dave Rael ha ragione, questo è lo stesso codice con valori diversi
Jacques,

6
Questo in realtà spiega l'operatore ternario. Quindi è una buona dipendenza dalla soluzione che non dice dove sia il vero e il falso nella condizione.
Maurizio In Danimarca,

3
Così ho pensato. come sviluppatori ci è permesso di avere risposte chiare .. a volte.
Mostri X

17

Per quelli di voi che usano ASP.net con il rasoio VB è anche possibile l'operatore ternario.

Deve anche essere all'interno di un'espressione di rasoio:

@(Razor_Expression)

e l'operatore ternario funziona come segue:

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

Lo stesso esempio di codice mostrato qui con il rasoio VB è simile al seguente:

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

Nota: quando si scrive un TextExpression, ricordare che i simboli booleani non sono gli stessi tra C # e VB.


1

nel mio problema voglio che il testo di anchor <a>text</a>all'interno della mia vista sia basato su un valore e che il testo venga recuperato dalla formaApp string Resources

quindi, questa @()è la soluzione

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

se il testo non proviene da App string Resourcesquesto

@(Model.ID == 0 ? "Back" :"Descart Changes")

0

Puoi anche usare questo metodo:

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

Prova questo .. Buona fortuna Grazie.


è necessario aggiungere @ con condizione mvc? Non credo, perché @ è già stato utilizzato all'inizio.
Mubashar Shahzad,

non c'è bisogno di usare @ sotto @ ()
Aikansh Mann il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.