วิธีใช้ ? : if statement ที่มี Razor และบล็อคโค้ดแบบอินไลน์


154

ฉันกำลังอัปเดตมุมมอง. aspx อันเก่าด้วยเอ็นจิ้นมุมมอง Razore ใหม่ ฉันมีสถานที่มากมายที่ฉันมีรหัสเช่นนี้:

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

เป็นการดีที่ฉันต้องการทำสิ่งนี้:

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

อย่างไรก็ตามมีสองปัญหาที่นี่:

  1. vote-up@{puzzle.UserVote .... ไม่ถือว่าสัญลักษณ์ @ เป็นจุดเริ่มต้นของการบล็อกรหัส
  2. @puzzle.UserVote == VoteType.Upดูที่ส่วนแรก@puzzle.UserVoteราวกับว่ามันควรจะแสดงค่าของตัวแปร

ใครรู้วิธีแก้ปัญหาเหล


6
ฉันไม่ได้ใช้มีดโกน แต่ขึ้นอยู่กับสิ่งที่ฉันเห็นลอง@(puzzle.UserVote == VoteType.Up ? "-selected" : "")
Lasse Espeholt

เช่นนี้เป็นผลมาจากด้านบนสำหรับผู้ประกอบการ ternary อินไลน์ในมีดโกนฉันจะเพิ่มว่าถ้าเอาท์พุทของคุณมี html หรือตัวอักษร encodable เช่น apostrophes เช่น@(isSomething ? "class='test'" : "")ตัวอย่างเช่นการฉีดจาวาสคริปต์หรือคล้ายกันก็จะเข้ารหัสพวกเขาเป็นหน่วยงานที่เหมือน&#39;และแตกหน้า Html.Raw("..")ดังนั้นคุณต้องใช้ ไม่เช่นนั้นด้วยโค้ดด้านบนคุณจะพบสิ่ง<p class=&#39;test&#39;>ที่ไม่ถูกต้อง
NibblyPig

คำตอบ:


298

สิ่งนี้น่าจะใช้ได้:

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

2
แปลกมากที่จะใช้ paren แทนที่จะเป็นวงเล็บปีกกา
pat capozzi

32

กุญแจสำคัญคือการแค็ปซูลนิพจน์ในวงเล็บหลัง @ ตัวคั่น คุณสามารถทำให้นิพจน์แบบผสมทำงานได้ด้วยวิธีนี้


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

1
ฉันไปที่นี่รู้สึกสะอาดและอ่านได้ง่ายในภายหลัง
Dan Harris

1
หากคุณต้องการแสดงค่าของพร็อพเพอร์ตี้ (รวมถึงสตริง) แทนที่จะโทรไปที่ ToString () - ซึ่งใช้ไม่ได้ในกรณีของฉัน คุณสามารถทำสิ่งนี้ได้ที่ @ (เงื่อนไข? $ "{foo.bar}": "ผิดนัด")
Dan Harris

6

ในกรณีส่วนใหญ่การแก้ปัญหาของCD ..จะทำงานได้อย่างสมบูรณ์ อย่างไรก็ตามฉันมีสถานการณ์ที่บิดเบี้ยวมากกว่านี้เล็กน้อย:

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

สิ่งนี้จะพิมพ์ฉัน "& nbsp;" &amp;nbsp;ในหน้าเว็บของฉันตามลำดับสร้างแหล่งที่มา ตอนนี้มีฟังก์ชันHtml.Raw("&nbsp;")ที่ควรให้คุณเขียนซอร์สโค้ดยกเว้นในกลุ่มนี้มันจะพ่นข้อผิดพลาดคอมไพเลอร์:

ข้อความแสดงข้อผิดพลาดของคอมไพเลอร์: CS0173: ไม่สามารถระบุประเภทของนิพจน์เงื่อนไขได้เนื่องจากไม่มีการแปลงโดยนัยระหว่าง 'System.Web.IHtmlString' และ 'สตริง'

ดังนั้นฉันจึงเขียนคำแถลงต่อไปนี้ซึ่งไม่ค่อยดีนัก แต่ใช้ได้แม้ในกรณีของฉัน:

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

หมายเหตุ: สิ่งที่น่าสนใจคือเมื่อคุณอยู่ในวงเล็บปีกกาคุณจะต้องเริ่มบล็อกมีดโกนอีกครั้ง


ทำไมต้องไม่ใช่@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
JP Hellemons

อืม .. แล้วเพราะข้อผิดพลาดของคอมไพเลอร์ดังกล่าวข้างต้น? ;)
Damian Vogel

3
ขออภัยฉันต้องการกาแฟเพิ่ม :)
JP Hellemons

1
คุณสามารถหลีกเลี่ยงข้อผิดพลาดนั้นได้โดยทำให้ผู้ประกอบการทั้งสามด้านเป็นประเภทเดียวกัน@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NibblyPig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.