Jak używać operatora trójdzielnego w razor (konkretnie na atrybutach HTML)?

Z WebForms view engine, będę powszechnie używać operatora ternary dla bardzo prostych warunków, zwłaszcza w atrybutach HTML. Na przykład:

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

Powyższy kod da tagowi <a> klasę auth lub anon w zależności od tego, czy użytkownik jest uwierzytelniony.

Jaka jest równoważna składnia z silnikiem Razor view? Ponieważ Razor wymaga znaczników HTML, aby "wiedzieć", kiedy przeskakiwać i wyłączać kod i znaczniki, obecnie utknąłem z po:

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

To jest, delikatnie mówiąc, straszne .

Chciałbym zrobić coś na przykład to, ale staram się zrozumieć, jak w Razor:

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

--

Update:

W międzyczasie stworzył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 od Razora:

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

Mimo to, mam nadzieję, że jest sposób, aby użyć operatora trójkowego, nie spadając z powrotem do owijania go w rozszerzenie metoda.

Author: Portman, 2010-11-04

6 answers

Powinieneś móc używać składni {[1] } wyrażenia:

<a class="@(User.Identity.IsAuthenticated ? "auth" : "anon")">My link here</a>
Nie mam zainstalowanej brzytwy, więc mogę się mylić.
 681
Author: David Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 04:57:15

Dodatek:

Ważną koncepcją jest to, że oceniasz wyrażenie w swoim kodzie brzytwy. Najlepszym sposobem na to (jeśli na przykład znajdujesz się w pętli foreach) jest użycie metody generycznej.

Składnia wywołania metody generycznej w Razor to:

@(expression)

W tym przypadku wyrażenie jest:

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

Dlatego rozwiązaniem jest:

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

Ten kod może być użyty wszędzie w Razor, nie tylko dla atrybutu html.

Zobacz komentarz @ Kyralessa dla składni C# Razor Quick Reference (Blog Phila Haacka).

 50
Author: awrigley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-16 11:36:15

Prostsza wersja, dla łatwych oczu!

@(true?"yes":"no")
 18
Author: Monsters X,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-22 15:57:49

Dla tych z Was, którzy używają ASP.net z VB razor możliwy jest również operator trójdzielny.

Musi być również wewnątrz wyrazu brzytwy:

@(Razor_Expression)

I operator trójdzielny działa następująco:

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

Ten sam przykład kodu pokazany tutaj z VB razor wygląda tak:

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

Uwaga: podczas pisania tekstu należy pamiętać, że symbole boolowskie nie są takie same między C# i VB.

 16
Author: George_DLJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-17 03:52:51

W moim problemie chcę, aby tekst anchora <a>text</a> wewnątrz mojego widoku był oparty na jakiejś wartości i ten tekst jest pobierany w formie App string Resources

Więc to {[4] } jest rozwiązaniem

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

Jeśli tekst nie jest z App string Resources Użyj tego

@(Model.ID == 0 ? "Back" :"Descart Changes")
 0
Author: Basheer AL-MOMANI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-17 07:19:06

Możesz również użyć tej metody:

<input type="text" class="@(@mvccondition ? "true-class" : "false-class")">
Spróbuj tego .. Powodzenia Dzięki.
 0
Author: Arjun,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-22 11:36:50