Sử dụng như thế nào? : nếu các câu lệnh với các khối mã dao động và nội tuyến


154

Tôi đang cập nhật các chế độ xem .aspx cũ của mình với công cụ xem Razore mới. Tôi có một loạt các nơi tôi có mã như thế này:

<span class="vote-up<%= puzzle.UserVote == VoteType.Up ? "-selected" : "" %>">Vote Up</span>

Lý tưởng nhất là tôi muốn làm điều này:

<span class="vote-up@{puzzle.UserVote == VoteType.Up ? "-selected" : ""}">Vote Up</span>

Tuy nhiên, có hai vấn đề ở đây:

  1. vote-up@{puzzle.UserVote .... không coi biểu tượng @ là bắt đầu của một khối mã
  2. @puzzle.UserVote == VoteType.Upnhìn vào phần đầu tiên @puzzle.UserVotenhư thể nó sẽ hiển thị giá trị của biến.

Bất cứ ai cũng biết làm thế nào để giải quyết những vấn đề này?


6
Tôi chưa sử dụng Dao cạo nhưng dựa trên những gì tôi thấy, hãy thử@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt

Vì đây là kết quả hàng đầu cho các toán tử ternary nội tuyến trong dao cạo, tôi sẽ thêm rằng nếu đầu ra của bạn chứa các ký tự html hoặc @(isSomething ? "class='test'" : "")mã hóa như dấu nháy đơn, ví dụ như tiêm javascript hoặc tương tự, nó sẽ mã hóa chúng thành các thực thể như &#39;và phá vỡ trang. Vì vậy, bạn phải sử dụng Html.Raw(".."). Mặt khác, với đoạn mã trên, bạn sẽ có một cái gì <p class=&#39;test&#39;>đó không hợp lệ.
NibblyPig

Câu trả lời:


298

Điều này sẽ làm việc:

<span class="vote-up@(puzzle.UserVote == VoteType.Up ? "-selected" : "")">Vote Up</span>

2
Rất lạ khi sử dụng paren thay vì
niềng răng

32

Điều quan trọng là gói gọn biểu thức trong ngoặc đơn sau dấu phân cách @. Bạn có thể làm cho bất kỳ biểu thức ghép nào hoạt động theo cách này.


28
@( condition ? "true" : "false" )

1
Tôi đã chọn cái này, cảm thấy sạch sẽ và dễ đọc lại sau
Dan Harris

1
Nếu bạn cần hiển thị giá trị của một thuộc tính (bao gồm cả chuỗi) thay vì gọi ToString () - Không hoạt động trong trường hợp của tôi. Bạn có thể làm điều này @ (điều kiện? $ "{Foo.bar}": "Mặc định")
Dan Harris

6

Trong hầu hết các trường hợp , giải pháp của CD .. sẽ hoạt động hoàn toàn tốt. Tuy nhiên tôi đã có một tình huống xoắn hơn một chút:

 @(String.IsNullOrEmpty(Model.MaidenName) ? "&nbsp;" : Model.MaidenName)

Điều này sẽ in cho tôi "& nbsp;" trong trang của tôi, tương ứng tạo nguồn &amp;nbsp;. Bây giờ có một chức năng Html.Raw("&nbsp;")được cho là cho phép bạn viết mã nguồn, ngoại trừ trong chòm sao này, nó đưa ra một lỗi biên dịch:

Thông báo lỗi trình biên dịch: CS0173: Loại biểu thức điều kiện có thể được xác định do không có chuyển đổi ngầm giữa 'System.Web.IHtmlString' và 'chuỗi'

Vì vậy, cuối cùng tôi đã viết một tuyên bố như sau, nó không hay nhưng hoạt động ngay cả trong trường hợp của tôi:

@if (String.IsNullOrEmpty(Model.MaidenName)) { @Html.Raw("&nbsp;") } else { @Model.MaidenName } 

Lưu ý: điều thú vị là, một khi bạn ở trong niềng răng xoăn, bạn phải khởi động lại một khối Dao cạo.


Tại sao không chỉ@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons

Uhm .. làm thế nào vì lỗi Trình biên dịch đã nói ở trên? ;)
Damian Vogel

3
Xin lỗi, tôi cần thêm cà phê :)
JP Hellemons

1
Bạn có thể tránh lỗi đó bằng cách làm cho cả hai phía của toán tử ternary cùng loại,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig
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.