Bagaimana cara menggunakan operator ternary dalam silet (khususnya pada atribut HTML)?

401

Dengan mesin tampilan WebForms, saya biasanya akan menggunakan operator ternary untuk persyaratan yang sangat sederhana, terutama di dalam atribut HTML. Sebagai contoh:

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

Kode di atas akan memberikan <a>tag kelas authatau anontergantung pada apakah pengguna diautentikasi.

Apa sintaksinya yang setara dengan mesin tampilan Razor? Karena Razor memerlukan tag HTML untuk "tahu" kapan harus masuk dan keluar dari kode dan markup, saya saat ini terjebak dengan yang berikut:

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

Ini, secara sederhana, mengerikan .

Saya ingin melakukan sesuatu seperti ini, tetapi saya berjuang untuk memahami caranya dalam Razor:

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

-

Memperbarui:

Sementara itu, saya telah membuat HtmlHelper ini:

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

yang bisa disebut seperti ini dari Razor:

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

Tetap saja, saya berharap ada cara untuk menggunakan operator ternary tanpa harus kembali membungkusnya dengan metode ekstensi.

Portman
sumber
Seperti halnya "Praktik Terbaik", saya percaya Anda harus kembali mengetik IHtmlStringdengan metode new HtmlString("Some stuff here");untuk pembantu dll ...
Justin Soliz
Anda membuat seperti stackoverflow.com/questions/6981853/…
Elan Hasson
Tolong pilih sini .
Shimmy Weitzhandler

Jawaban:

767

Anda harus dapat menggunakan @()sintaks ekspresi:

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

Saya tidak menginstal Razor, jadi saya bisa salah.

David Brown
sumber
60
Berikut ini adalah referensi praktis untuk sintaks Razor: C # Sintaks Razor Referensi Cepat
Ryan Lundy
<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> Tautan saya di sini </a>
BiLaL
Bisakah saya menambahkan && operator ke dalam logika ini?
alerya
58

Tambahan:

Konsep penting adalah Anda mengevaluasi ekspresi dalam kode Razor Anda. Cara terbaik untuk melakukan ini (jika, misalnya, Anda berada di loop foreach) menggunakan metode generik.

Sintaks untuk memanggil metode generik dalam Razor adalah:

@(expression)

Dalam hal ini, ungkapannya adalah:

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

Oleh karena itu, solusinya adalah:

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

Kode ini dapat digunakan di mana saja di Razor, bukan hanya untuk atribut html.

Lihat komentar @Kyralessa untuk Referensi Cepat C # Razor Syntax (blog Phil Haack).

awrigley
sumber
perhatikan adendum Anda setelah menambahkan komentar serupa ke jawaban utama.
BiLaL
22

Versi yang lebih sederhana, untuk mata yang mudah!

@(true?"yes":"no")
Monster X
sumber
11
itu tidak sederhana. itulah jawaban yang sama dengan nilai yang berbeda
Dave Rael
4
-1 Dave Rael benar, ini adalah kode yang sama dengan nilai yang berbeda
Jacques
6
Ini sebenarnya menjelaskan operator ternary. Jadi itu adalah kecanduan yang baik untuk solusi yang tidak mengatakan di mana benar dan salah dalam kondisi tersebut.
Maurizio In denmark
3
Saya pikir juga begitu. sebagai pengembang kami diizinkan memiliki jawaban yang jelas .. kadang-kadang.
Monster X
17

Bagi Anda yang menggunakan ASP.net dengan pisau cukur V, operator ternary juga memungkinkan.

Itu juga harus di dalam ekspresi pisau cukur:

@(Razor_Expression)

dan operator ternary bekerja sebagai berikut:

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

Contoh kode yang sama ditunjukkan di sini dengan pisau cukur VB terlihat seperti ini:

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

Catatan: saat menulis TextExpression ingat bahwa simbol Boolean tidak sama antara C # dan VB.

George_DLJ
sumber
1

dalam masalah saya, saya ingin teks jangkar <a>text</a>di dalam pandangan saya didasarkan pada beberapa nilai dan teks itu diambil bentuknyaApp string Resources

jadi, ini @()solusinya

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

jika teks tidak App string Resourcesdigunakan ini

@(Model.ID == 0 ? "Back" :"Descart Changes")
Basheer AL-MOMANI
sumber
0

Anda juga dapat menggunakan metode ini:

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

Coba ini .. Semoga berhasil, Terima kasih.

Arjun
sumber
apakah ada kebutuhan untuk menambahkan @ dengan kondisi MVC? Saya rasa tidak, karena @ sudah digunakan di awal.
Mubashar Shahzad
tidak perlu menggunakan @ di bawah @ ()
Aikansh Mann