Làm cách nào để sử dụng toán tử ternary trong dao cạo (cụ thể là trên các thuộc tính HTML)?


401

Với công cụ xem WebForms, tôi thường sử dụng toán tử ternary cho các điều kiện rất đơn giản, đặc biệt là trong các thuộc tính HTML. Ví dụ:

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

Đoạn mã trên sẽ cung cấp cho <a>thẻ một lớp authhoặc anontùy thuộc vào việc người dùng có được xác thực hay không.

Cú pháp tương đương với công cụ xem dao cạo là gì? Bởi vì Razor yêu cầu các thẻ HTML để "biết" khi nào nên nhảy vào và ra khỏi mã và đánh dấu, nên tôi hiện đang bị mắc kẹt với những điều sau:

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

Đây là, để đặt nó nhẹ, khủng khiếp .

Tôi rất thích làm một cái gì đó như thế này, nhưng đang đấu tranh để hiểu làm thế nào trong Dao cạo:

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

-

Cập nhật:

Trong thời gian chờ đợi, tôi đã tạo HtmlHelper này:

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

có thể được gọi như thế này từ Dao cạo:

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

Tuy nhiên, tôi hy vọng có một cách để sử dụng toán tử ternary mà không quay lại gói nó trong một phương thức mở rộng.


Cũng giống như vấn đề "Thực hành tốt nhất" Tôi tin rằng bạn nên quay lại IHtmlStringvới phương thức new HtmlString("Some stuff here");dành cho người trợ giúp, v.v ...
Justin Soliz



Câu trả lời:


767

Bạn sẽ có thể sử dụng @()cú pháp biểu thức:

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

Mặc dù vậy, tôi không cài đặt Dao cạo, vì vậy tôi có thể sai.


60
Đây là một tài liệu tham khảo hữu ích về cú pháp của Dao cạo: C # Dao cạo Cú pháp Tham khảo nhanh
Ryan Lundy

<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> Liên kết của tôi ở đây </a>
BiLaL

Tôi có thể thêm && toán tử vào logic này không?
alerya

58

Phụ lục:

Khái niệm quan trọng là bạn đang đánh giá một biểu thức trong mã Dao cạo của bạn. Cách tốt nhất để làm điều này (ví dụ, nếu bạn đang ở trong một vòng lặp foreach) là sử dụng một phương thức chung.

Cú pháp để gọi một phương thức chung trong Dao cạo là:

@(expression)

Trong trường hợp này, biểu thức là:

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

Do đó, giải pháp là:

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

Mã này có thể được sử dụng ở bất cứ đâu trong Dao cạo, không chỉ cho một thuộc tính html.

Xem bình luận của @Kyralessa cho C # Razor Syntax Tham khảo nhanh (blog của Phil Haack).


chỉ cần chú ý phần phụ lục của bạn sau khi thêm các bình luận tương tự vào câu trả lời chính.
BiLaL

22

Một phiên bản đơn giản hơn, cho mắt dễ dàng!

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

11
Điều đó không đơn giản. đó là cùng một câu trả lời với các giá trị khác nhau
Dave Rael

4
-1 Dave Rael đã đúng, đây là cùng một mã với các giá trị khác nhau
Jacques

6
Điều này thực sự giải thích các toán tử ternary. Vì vậy, đó là một nghiện tốt cho giải pháp mà không nói đâu là đúng và sai trong điều kiện.
Maurizio Trong dấu hiệu

3
Tôi cũng nghĩ vậy là nhà phát triển, chúng tôi được phép có câu trả lời rõ ràng .. đôi khi.
Quái vật X

17

Đối với những người sử dụng ASP.net với VB dao cạo, nhà điều hành ternary cũng có thể.

Nó cũng phải, bên trong một biểu hiện dao cạo:

@(Razor_Expression)

và toán tử ternary hoạt động như sau:

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

Ví dụ mã tương tự được hiển thị ở đây với dao cạo VB trông như thế này:

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

Lưu ý: khi viết TextExpression hãy nhớ rằng các ký hiệu Boolean không giống nhau giữa C # và VB.


1

trong vấn đề của tôi, tôi muốn văn bản neo <a>text</a>trong chế độ xem của tôi dựa trên một số giá trị và văn bản đó được lấy ở dạngApp string Resources

vì vậy, đây @()là giải pháp

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

nếu văn bản không App string Resourcessử dụng

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

0

Bạn cũng có thể sử dụng phương pháp này:

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

Hãy thử điều này .. Chúc may mắn Cảm ơn.


Có cần thêm @ với điều kiện mvc không? Tôi không nghĩ vậy, vì @ đã được sử dụng ngay từ đầu.
Mubashar Shahzad

không cần sử dụng @ theo @ ()
Aikansh Mann
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.