วิธีการใช้ผู้ประกอบการที่สามในมีดโกน (โดยเฉพาะกับคุณลักษณะ HTML)?


401

ด้วยเอ็นจิ้นการดู WebForms ฉันมักจะใช้โอเปอร์เรเตอร์สำหรับเงื่อนไขที่ง่ายมากโดยเฉพาะในแอตทริบิวต์ HTML ตัวอย่างเช่น:

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

รหัสด้านบนจะให้<a>แท็กเป็นคลาสauthหรือanonขึ้นอยู่กับว่าผู้ใช้รับรองความถูกต้อง

ไวยากรณ์ที่เทียบเท่ากับเอ็นจิ้นมุมมองมีดโกนคืออะไร? เนื่องจากมีดโกนต้องใช้แท็ก HTML เพื่อ "รู้" เมื่อต้องกระโดดเข้าและออกจากรหัสและมาร์กอัปฉันจึงติดอยู่กับสิ่งต่อไปนี้:

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

นี่คือที่จะนำมันอย่างอ่อนโยนน่ากลัว

ฉันชอบที่จะทำอะไรบางอย่างเช่นนี้ แต่กำลังดิ้นรนเพื่อให้เข้าใจวิธีการในมีดโกน:

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

-

ปรับปรุง:

ในระหว่างนี้ฉันได้สร้าง HtmlHelper นี้:

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

ซึ่งสามารถเรียกสิ่งนี้ได้จากมีดโกน:

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

แต่ถึงกระนั้นฉันหวังว่าจะมีวิธีการใช้ผู้ประกอบการที่สามโดยไม่ต้องถอยกลับไปห่อในวิธีการขยาย


เช่นเดียวกับเรื่องของ "การปฏิบัติที่ดีที่สุด" ผมเชื่อว่าคุณควรจะกลับมาชนิดIHtmlStringที่มีวิธีการnew HtmlString("Some stuff here");สำหรับผู้ช่วยเหลือ ฯลฯ ...
จัสติน Soliz

คุณทำเหมือนstackoverflow.com/questions/6981853/…
Elan Hasson

โปรดให้คะแนนที่นี่
Shimmy Weitzhandler

คำตอบ:


767

คุณควรจะสามารถใช้@()ไวยากรณ์การแสดงออก:

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

แม้ว่าฉันไม่ได้ติดตั้งมีดโกนไว้ดังนั้นฉันอาจผิด


60
นี่คือการอ้างอิงที่สะดวกในการใช้ไวยากรณ์ของมีดโกน: การอ้างอิงด่วนของไวยากรณ์ของ C # Razor
Ryan Lundy

<a class=@(User.Identity.IsAuthenticated? "auth": "anon")> ลิงก์ของฉันที่นี่ </a>
BiLaL

ฉันสามารถเพิ่ม && โอเปอเรเตอร์ลงในบันทึกนี้ได้หรือไม่
alerya

58

ภาคผนวก:

แนวคิดที่สำคัญคือคุณกำลังประเมินการแสดงออกในรหัสมีดโกนของคุณ วิธีที่ดีที่สุดในการทำเช่นนี้ (ถ้าเช่นคุณอยู่ในวง foreach) กำลังใช้วิธีการทั่วไป

ไวยากรณ์สำหรับการเรียกใช้เมธอดทั่วไปใน Razor คือ:

@(expression)

ในกรณีนี้นิพจน์คือ:

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

ดังนั้นทางออกคือ:

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

รหัสนี้สามารถใช้ได้ทุกที่ในมีดโกนไม่ใช่เฉพาะสำหรับแอตทริบิวต์ html

ดูความคิดเห็นของ @Kyralessa สำหรับการอ้างอิงด่วน C # Razor Syntax (บล็อกของ Phil Haack)


เพิ่งสังเกตเห็นภาคผนวกของคุณหลังจากเพิ่มความคิดเห็นที่คล้ายกันในคำตอบหลัก
BiLaL

22

รุ่นที่ง่ายกว่าเพื่อดวงตาที่ดูง่าย!

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

11
นั่นไม่ใช่เรื่องง่าย นั่นเป็นคำตอบเดียวกันกับค่าที่ต่างกัน
เดฟราเอล

4
-1 Dave Rael ถูกต้องซึ่งเป็นรหัสเดียวกันที่มีค่าต่างกัน
Jacques

6
นี่เป็นการอธิบายผู้ประกอบการที่สาม ดังนั้นมันจึงเป็นสิ่งที่ดีสำหรับการแก้ปัญหาที่ไม่ได้บอกว่าอยู่ในสภาพจริงและเท็จ
Maurizio ในเดนมาร์ก

3
ฉันคิดอย่างนั้น ในฐานะนักพัฒนาเราได้รับอนุญาตให้มีคำตอบที่ชัดเจน .. บางครั้ง
Monsters X

17

สำหรับผู้ที่ใช้ ASP.net กับ VB มีดโกนผู้ประกอบการที่สามก็เป็นไปได้เช่นกัน

มันจะต้องเป็นเช่นนั้นในการแสดงออกของมีดโกน:

@(Razor_Expression)

และผู้ประกอบการประกอบไปด้วยทำงานดังนี้:

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

ตัวอย่างรหัสเดียวกันที่แสดงที่นี่ด้วย VB มีดโกนมีลักษณะดังนี้:

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

หมายเหตุ: เมื่อเขียน TextExpression โปรดจำไว้ว่าสัญลักษณ์บูลีนจะไม่เหมือนกันระหว่าง C # และ VB


1

ในปัญหาของฉันฉันต้องการข้อความของจุดยึด<a>text</a>ในมุมมองของฉันที่จะขึ้นอยู่กับค่าบางอย่างและข้อความที่ถูกดึงมาApp string Resources

ดังนั้นนี่@()คือทางออก

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

ถ้าข้อความไม่ได้App string Resourcesใช้

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

0

คุณยังสามารถใช้วิธีนี้:

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

ลองนี้ .. ขอให้โชคดี


จำเป็นต้องเพิ่ม @ ด้วยเงื่อนไข mvc หรือไม่ ฉันไม่คิดอย่างนั้นเพราะ @ ถูกใช้แล้วตั้งแต่เริ่มต้น
Mubashar Shahzad

ไม่จำเป็นต้องใช้ @ ภายใต้ @ ()
Aikansh Mann
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.