Üçlü işleç usturada nasıl kullanılır (özellikle HTML özelliklerinde)?


401

WebForms görünüm motoruyla, genellikle HTML öznitelikleri dahilinde, çok basit şartlar için üçlü işleç kullanacağım. Örneğin:

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

Yukarıdaki kod verecektir <a>etiketini sınıfını authveya anonkullanıcı kimlik doğrulaması olup olmamasına bağlı olarak.

Razor view motoruyla eşdeğer sözdizimi nedir? Razor, HTML etiketlerinin kod ve biçimlendirmeye ne zaman girip çıkacağını bilmek için HTML etiketlerine ihtiyaç duyduğundan, şu anda aşağıdakilere takılı kaldım:

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

Bu, hafifçe söylemek gerekirse, korkunç .

Böyle bir şey yapmak isterdim , ama Razor'da nasıl olduğunu anlamakta zorlanıyorum:

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

-

Güncelleme:

Bu arada, bu HtmlHelper'ı oluşturdum:

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

Razor'dan şöyle denilebilir:

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

Yine de, üçlü bir operatörü bir uzatma yöntemiyle sarmalamaya geri dönmeden kullanmanın bir yolu olduğunu umuyorum.


Sadece "En İyi Uygulama" meselesi olarak sana türü döndüren gerektiğine inanıyoruz IHtmlStringyöntemiyle new HtmlString("Some stuff here");vs ... yardımcıları için
Justin Soliz


Lütfen buraya oy verin .
Shimmy Weitzhandler

Yanıtlar:


767

@()İfade sözdizimini kullanabilmeniz gerekir :

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

Yine de Razor yüklü değil, bu yüzden yanlış olabilirim.


60
İşte Jilet sözdizimi için kullanışlı bir referans: C # Jilet Sözdizimi Hızlı Referans
Ryan Lundy

<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> Buradaki bağlantım </a>
BiLaL

Bu mantıklara && operatörü ekleyebilir miyim?
alerya

58

Zeyilname:

Önemli kavram, Razor kodunuzdaki bir ifadeyi değerlendirmenizdir. Bunu yapmanın en iyi yolu (örneğin, bir foreach döngüsünde iseniz) genel bir yöntem kullanmaktır.

Razor'da genel bir yöntemi çağırmak için sözdizimi şöyledir:

@(expression)

Bu durumda, ifade:

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

Bu nedenle, çözüm:

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

Bu kod, yalnızca bir html özelliği için değil, Razor'da herhangi bir yerde kullanılabilir.

@Kyralessa adlı kullanıcının C # Razor Syntax Quick Reference (Phil Haack'in blogu) adlı kullanıcının yorumuna bakın.


ana cevaba benzer yorumlar ekledikten sonra zeyilnamenizi fark ettiniz.
BiLaL

22

Kolay gözler için daha basit bir versiyon!

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

11
bu daha basit değil. farklı değerlerle aynı cevap
Dave Rael

4
-1 Dave Rael doğru, bu farklı değerlerle aynı kod
Jacques

6
Bu aslında üçlü operatörü açıklar. Bu nedenle, durumdaki doğru ve yanlışın nerede olduğunu söylemeyen çözüme iyi bir bağımlılık.
Maurizio Danimarka'da

3
Ben de öyle düşünmüştüm. geliştiriciler olarak net cevaplar almamıza izin verilir .. bazen.
Canavarlar X

17

ASP.net'i VB ustura ile kullananlarınız için üçlü operatör de mümkündür.

Ayrıca, bir ustura ifadesinin içinde olmalıdır:

@(Razor_Expression)

ve üçlü operatör aşağıdaki gibi çalışır:

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

Burada VB ustura ile gösterilen kod örneğine benzer:

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

Not: TextExpression yazarken, Boole sembollerinin C # ve VB arasında aynı olmadığını unutmayın.


1

benim sorunum <a>text</a>içinde görünümümdeki çapa metninin bir değere dayanmasını istiyorum ve bu metin formu alındıApp string Resources

yani @()çözüm bu

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

Metin dan değilse App string Resourceskullanımı bu

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

0

Bu yöntemi de kullanabilirsiniz:

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

Şunu deneyin .. İyi şanslar Teşekkürler.


mvc koşulu ile @ eklemeye gerek var mı? Ben öyle düşünmüyorum, çünkü @ başlangıçta zaten kullanılmış.
Mubashar Shahzad

@ () altında @ kullanmanıza gerek yok
Aikansh Mann
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.