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.
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ć.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).
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")
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.
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")
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.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