कैसे इस्तेमाल करे ? : यदि रेजर और इनलाइन कोड ब्लॉक के साथ स्टेटमेंट


154

मैं अपने पुराने .aspx विचारों को नए रेजर व्यू इंजन के साथ अपडेट कर रहा हूं। मेरे पास ऐसे स्थानों का एक समूह है जहां मेरे पास इस तरह का कोड है:

<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" : "")
लेसे एस्पेहॉल्ट

जैसा कि रेजर में इनलाइन टर्नरी ऑपरेटरों के लिए यह शीर्ष परिणाम है, मैं इसे जोड़ता हूं कि यदि आपके आउटपुट में html या एन्कोडेबल वर्ण जैसे एपोस्ट्रोफिस हैं, उदाहरण @(isSomething ? "class='test'" : "")के लिए जावास्क्रिप्ट या इसी तरह के इंजेक्शन लगाने पर, यह उन्हें &#39;पेज को तोड़ने और तोड़ने के रूप में एन्कोड करेगा । इसलिए आप जरूर इस्तेमाल करें Html.Raw("..")। अन्यथा उपरोक्त कोड के साथ आप ऐसा कुछ समाप्त करेंगे <p class=&#39;test&#39;>जो अमान्य है।
निब्लीपिग

जवाबों:


298

यह काम करना चाहिए:

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

2
बहुत अजीब है बल्कि
पराग

32

कुंजी @ सीमांकक के बाद कोष्ठक में अभिव्यक्ति को संक्षिप्त करना है। आप किसी भी यौगिक अभिव्यक्ति को इस तरह से काम कर सकते हैं।


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

1
मैं इसके लिए गया, स्वच्छ महसूस करता हूं और बाद में वापस पढ़ना आसान है
दान हैरिस

1
अगर आपको ToString () को कॉल करने के बजाय किसी प्रॉपर्टी (एक स्ट्रिंग सहित) का मूल्य प्रदर्शित करने की आवश्यकता है - जो मेरे मामले में काम नहीं आया। आप यह कर सकते हैं @ (स्थिति! $ "{Foo.bar}": "डिफ़ॉल्ट")
डैन हैरिस

6

ज्यादातर मामलों में सीडी का समाधान .. पूरी तरह से ठीक काम करेगा। हालाँकि मेरी स्थिति थोड़ी अधिक थी:

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

यह मुझे प्रिंट करेगा "& nbsp;" मेरे पेज में, क्रमशः स्रोत उत्पन्न करते हैं &amp;nbsp;। अब एक फ़ंक्शन है Html.Raw("&nbsp;")जो आपको स्रोत कोड लिखने देता है, इस नक्षत्र को छोड़कर यह एक संकलक त्रुटि फेंकता है:

संकलक त्रुटि संदेश: CS0173: सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता है क्योंकि 'System.Web.IHtmlString' और 'string' के बीच कोई अंतर्निहित रूपांतरण नहीं है

इसलिए मैंने निम्नलिखित की तरह एक बयान लिखना समाप्त किया, जो कम अच्छा है लेकिन मेरे मामले में भी काम करता है:

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

नोट: दिलचस्प बात यह है कि एक बार जब आप घुंघराले ब्रेस के अंदर होते हैं, तो आपको रेजर ब्लॉक को फिर से शुरू करना होगा।


सिर्फ क्यों नहीं@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Model.MaidenName)
जेपी हेल्लेमन्स

उह .. उपरोक्त कंपाइलर त्रुटि के कारण कैसे? ;)
डेमियन वोगेल

3
क्षमा करें, मुझे और अधिक कॉफी की आवश्यकता है :)
JP Hellemons

1
आप टर्नरी ऑपरेटर के दोनों किनारों को एक ही प्रकार बनाकर उस त्रुटि से बच सकते हैं,@(String.IsNullOrEmpty(Model.MaidenName) ? Html.Raw("&nbsp;") : Html.Raw(Model.MaidenName))
NIBlyPig
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.