Jak korzystać z trójskładnikowego operatora brzytwy (szczególnie w atrybutach HTML)?

401

W silniku widoku WebForms często używam operatora trójskładnikowego do bardzo prostych warunków warunkowych, szczególnie w atrybutach HTML. Na przykład:

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

Powyższy kod nadaje <a>tagowi klasę authlub anonzależy od tego, czy użytkownik jest uwierzytelniony.

Jaka jest równoważna składnia z silnikiem widoku Razor? Ponieważ Razor wymaga tagów HTML, aby „wiedzieć”, kiedy wskoczyć i wyskoczyć z kodu i znaczników, obecnie mam problem z:

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

Jest to, delikatnie mówiąc, okropne .

Chciałbym zrobić coś takiego , ale staram się zrozumieć, jak w Razor:

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

-

Aktualizacja:

W międzyczasie utworzyłem ten HtmlHelper:

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

które można nazwać tak z Razor:

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

Mam jednak nadzieję, że istnieje sposób na użycie operatora trójskładnikowego bez wracania do pakowania go w metodę rozszerzenia.

Portman
źródło
Właśnie w ramach „najlepszych praktyk” uważam, że powinieneś powracać IHtmlStringz pomocą metody new HtmlString("Some stuff here");dla pomocników itp.
Justin Soliz
Głosuj tutaj .
Shimmy Weitzhandler

Odpowiedzi:

767

Powinieneś być w stanie użyć @()składni wyrażenia:

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

Jednak nie mam zainstalowanej Razor, więc mogę się mylić.

David Brown
źródło
60
Oto przydatne odniesienie do składni Razor: C # Razor Skrócona instrukcja
Ryan Lundy
<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> Mój link tutaj </a>
BiLaL
Czy mogę dodać operatora && do tej logiki?
alerya
58

Uzupełnienie:

Ważna koncepcja polega na tym, że oceniasz wyrażenie w kodzie Razor. Najlepszym sposobem na to (jeśli na przykład jesteś w pętli foreach) jest użycie metody ogólnej.

Składnia wywołania metody ogólnej w Razor jest następująca:

@(expression)

W takim przypadku wyrażenie to:

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

Dlatego rozwiązaniem jest:

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

Tego kodu można używać w dowolnym miejscu w Razor, nie tylko w przypadku atrybutu HTML.

Zobacz komentarz @ Kyralessa dla C # Razor Syntax Quick Reference (blog Phila Haacka).

awrigley
źródło
właśnie zauważyłem twój dodatek po dodaniu podobnych komentarzy do głównej odpowiedzi.
BiLaL,
22

Prostsza wersja, dla łatwych oczu!

@(true?"yes":"no")
Potwory X
źródło
11
to nie jest prostsze. to ta sama odpowiedź z różnymi wartościami
Dave Rael
4
-1 Dave Rael ma rację, to ten sam kod z różnymi wartościami
Jacques
6
To właściwie wyjaśnia trójskładnikowego operatora. To dobre uzależnienie od rozwiązania, które nie mówi, gdzie jest prawda i fałsz w danym stanie.
Maurizio In Dania
3
Tak myślałem. jako programiści możemy mieć jasne odpowiedzi. czasami.
Potwory X
17

Dla tych, którzy używają ASP.net z maszynką VB, operator trójskładnikowy jest również możliwy.

Musi również znajdować się w wyrazie brzytwy:

@(Razor_Expression)

a operator trójskładnikowy działa w następujący sposób:

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

Ten sam przykład kodu pokazany tutaj z maszynką VB wygląda następująco:

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

Uwaga: pisząc TextExpression pamiętaj, że symbole logiczne nie są takie same między C # i VB.

George_DLJ
źródło
1

w moim problemie chcę, aby tekst zakotwiczenia <a>text</a>w moim widoku opierał się na pewnej wartości i ten tekst został pobrany z postaciApp string Resources

więc to @()jest rozwiązanie

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

jeśli tekst nie pochodzi z, App string Resourcesużyj tego

@(Model.ID == 0 ? "Back" :"Descart Changes")
Basheer AL-MOMANI
źródło
0

Możesz także użyć tej metody:

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

Spróbuj tego .. Powodzenia Dzięki.

Arjun
źródło
czy istnieje potrzeba dodawania @ z warunkiem mvc? Nie sądzę, ponieważ @ był już używany na początku.
Mubashar Shahzad
nie trzeba używać @ pod @ ()
Aikansh Mann