2010-12-06 18 views
5
//CHECK IF WE SHOULD SHOW THE PASSWORD HINT OR NOT 
Setting passwordhints; 

using (var db = new dbDataContext()) 
{ 
    passwordhints = (from c in db.Settings 
      where c.Name == "ShowPasswordHints" && c.ID == _ID 
      select c).FirstOrDefault(); 
} 

if (passwordhints != null) 
    //NOTE: .Value IS A STRING 
    ViewData["ShowPasswordHints"] = passwordhints.Value; 
else 
    ViewData["ShowPasswordHints"] = "False"; 

//END PASSWORD HINTS CHECK 

, नियंत्रक में है जब मैं शीर्षक टैग में पेज ही मैं उत्पादनक्यों = ViewData [""] एक स्ट्रिंग दिखाएगा लेकिन उसी स्ट्रिंग के लिए इसका मूल्यांकन विफल हो जाएगा?

<%=ViewData["ShowPasswordHints"]%> के लिए मिलता है और मैं इसे देखना अप कर सकते हैं वहाँ यह कहते हैं, "यह सच है" (उद्धरण के बिना, मैं भी द्वारा रिक्त स्थान के लिए जाँच कोष्ठक के साथ इसके आसपास और कोई रिक्त स्थान यह सचमुच है सिर्फ सच है)

हालांकि जब मैं

<%if(ViewData["ShowPasswordHints"] == "True") {%> SHOW THIS <%}%> 

शो करना प्रतीत होता है यह कभी नहीं, क्या नरक देखते हैं?

अद्यतन: हालांकि, अगर व्यूडाटा इस तरह सेट है ... यह काम करता है ... हू ??

if (accountRepository.isLDAPEnabled(_ID)) 
       ViewData["LDAP"] = "True"; 
      else 
       ViewData["LDAP"] = "False"; 

दृश्य ...

<%if(ViewData["LDAP"] == "True"){ %> 
      SHOW THIS 
     <%} %> 

सभी को धन्यवाद, यहाँ नई विधि कि महान

ViewData["something"] = true; 

<%if(true.Equals(ViewData["something"])){%> SHOW THIS <%}%> 

उत्तर

9

काम है ViewData के बाद से एक IDictionary<string, object> है, ViewData["ShowPasswordHints"] प्रकार object की है। डिफ़ॉल्ट रूप से, object एस संदर्भ द्वारा तुलना की जाती है। आप एक मूल्य तुलना चाहते हैं। इस प्रकार, एक string है, जो एक मूल्य तुलना कारण होगा करने के लिए इसे कास्टिंग की कोशिश:

<%if((string)ViewData["ShowPasswordHints"] == "True") {%> SHOW THIS <%}%> 

msdn पर अधिक।

अद्यतन: आपके द्वारा ViewData["ShowPasswordHints"] में डाला गया मान हमेशा एक स्ट्रिंग होता है। हालांकि, चूंकि सी # स्थिर रूप से टाइप किया गया है, इसलिए संकलक यह नहीं जानता कि जब आप इसे वापस लेते हैं, तो यह एक स्ट्रिंग है - यह केवल यह जानता है कि यह एक वस्तु होगी, क्योंकि ViewDataIDictionary<string, object> (एक शब्दकोष सादे ऑब्जेक्ट्स लौट रहा है) । लेकिन चूंकि आप बेहतर जानते हैं, तो आप इसे string पर डाल सकते हैं जिसे आप जानते हैं कि यह होना चाहिए। (BTW, मुझे लगता है कि ViewData MVC ढांचे की सबसे कमजोर बिंदुओं में से एक है, इस कारण से और दूसरों के लिए)

क्यों इस <title> में काम करता है क्योंकि <%= %> टैग उन में जो कुछ भी पर ToString() कहते हैं। चूंकि ViewData["ShowPasswordHints"] एक स्ट्रिंग है, यह आपकी अपेक्षा की तरह आता है - स्ट्रिंग के ToString() स्ट्रिंग स्वयं ही है।

अंत में: आप एक बूलियन का उपयोग क्यों नहीं कर रहे हैं?

+2

शायद एक बेहतर (अधिक सुरक्षित) दृष्टिकोण '" सत्य "होगा। (देखेंडाटा [" ShowPasswordHints "])'। कोई क्लासकास्ट अपवाद नहीं है यदि दृश्य डेटा शब्दकोश में ऑब्जेक्ट स्ट्रिंग नहीं है। – cdhowie

+0

यह भी मदद करेगा यदि आपने समझाया कि ऑब्जेक्ट को अपने पहले मामले, शीर्षक टैग में संदर्भित करते समय यह स्वचालित रूप से क्यों होता है। – Sorpigal

+0

मेरा अपडेट देखें, कभी-कभी यह क्यों काम करता है? जब मैंने = obj की बजाय = "True" कहने का प्रयास किया। वैल्यू यह अभी भी काम नहीं करता है लेकिन ऊपर जो कोड मैंने ऊपर जोड़ा है, मैं इस से बहुत परेशान हूं :( – BigOmega