2008-12-12 6 views
9

कहें कि आपके पास ASP.NET ASP की तरह कुछ है: विवरण दृश्य डेटाबेस में एक रिकॉर्ड दिखाने और संपादित करने के लिए।क्या "सफलता संदेश" करने के लिए ASP.NET में कोई मूल तरीका है?

त्रुटि मामलों को रिकॉर्ड करना आसान है ... आप सत्यापन और सत्यापन सारांश जोड़ते हैं। जब आपका अपडेट फॉर्म सत्यापन में विफल रहता है तो यह स्वाभाविक रूप से शोर बनाता है: यह सत्यापन संदेश और/या सत्यापन सारांश दिखाता है। पीछे एक भी कोड की आवश्यकता नहीं है।

लेकिन फिर, आप सत्यापन पास करते हैं, और यह आपके अपडेट को पूरी तरह से चुपचाप बनाता है। कोई समझ नहीं है कि कुछ भी हुआ, और कोड-बैक के बिना सफलता संदेश बनाने के लिए कोई डिफ़ॉल्ट सेटिंग प्रतीत नहीं होती है।

लेकिन, यहां तक ​​कि कोड-पीछे भी उलझन में हैं। सफलता संदेश को किस घटना को दिखाना चाहिए? onItemUpdate, है ना? ठीक है, लेकिन फिर मान लें कि आप एक और बदलाव करते हैं और सत्यापन त्रुटि प्राप्त करते हैं? आपका सफलता संदेश रहता है। मैं एक ऐसी घटना नहीं ढूंढ पा रहा था जो वैधता त्रुटि होने पर मौजूदा सफलता संदेश को विश्वसनीय रूप से बंद कर दे।

यह वेब विकास 101 होना चाहिए! वो इतना मुस्किल क्यों है?

संपादित करें:

किसी ItemCommand घटना ... मैं यह और कई अन्य घटनाओं की कोशिश की का उपयोग कर सुझाव दिया है, लेकिन यह सफलता संदेश बस गायब नहीं होंगे। यहां कुछ कोड है।

ASP.NET

<label id="successMessage" class="successMessage" runat="server"></label> 

में मेरा संदेश और मेरे DataView टैग (सरलीकृत):

<asp:DetailsView 
     Id="EditClient" 
     DataKeyNames="LicenseID" 
    DataSourceID="MySource" 
    runat="server" 
     OnItemUpdated="SuccessfulClientUpdate" 
     OnItemCommand="ClearMessages"> 

और, मेरी कोड-पीछे:

protected void SuccessfulClientUpdate(object sender, DetailsViewUpdatedEventArgs e) 
{ 
    successMessage.InnerText = string.Format("Your changes were saved."); 
    successMessage.Visible = true; 
} 

protected void ClearMessages(object sender, DetailsViewCommandEventArgs e) 
{ 
    successMessage.InnerText = string.Empty; 
    successMessage.Visible = false; 
} 

एक बार जब मैं करता हूँ सफल अपडेट, हालांकि, ऐसा लगता है कि वह संदेश गायब नहीं हुआ है, यहां तक ​​कि सत्यापन विफल भी नहीं हुआ है।

2 संपादित करें:

बस स्पष्ट होना है कि मैं Page_Load में ClearMessages कोड डालने की कोशिश किया था चाहते हैं। हालांकि, कुछ भी ऐसा नहीं लगता है जब मैं एक सत्यापन त्रुटि के साथ दूसरी बार अद्यतन मारा जब मैसेज लेबल गायब हो जाता है। क्या कोई अन्य समस्या निवारण युक्तियाँ सुझा सकता है?

उत्तर

7

जहां तक ​​मुझे पता है, ऐसा करने का कोई मूल तरीका नहीं है। आप इसके बारे में चिंतित हो सकते हैं, शायद माइक्रोसॉफ्ट इसे सुनेंगे :)।

पेज_लोड पर "सफलता संदेश" को रीसेट करना, या आपके कोड के पीछे कहीं भी, काम नहीं करेगा। ऐसा इसलिए है क्योंकि एएसपी.NET प्रमाणीकरण आमतौर पर क्लाइंट और सर्वर दोनों पक्षों को किया जाता है। इसका अर्थ यह है कि आप पृष्ठ पर रखे गए प्रत्येक सत्यापन नियंत्रण के लिए, एएसपी.नेट कुछ क्लाइंट-साइड जावास्क्रिप्ट उत्पन्न करता है जो क्लाइंट पर के बिना प्रमाणीकरण करता है और सर्वर पर वापस जाता है। तो आप एक ही समय में सफलता संदेश और त्रुटि संदेश दोनों के साथ अटक गए हैं।

क्या आप इसके बारे में क्या कर सकते हैं: अपने पृष्ठ पर एक <div> नियंत्रण

  • जगह, कि सफलता संदेश तब दिखाई देते हैं (जैसा कि पहले से ही ऊपर दूसरों के द्वारा सुझाव दिया)। जब भी आप कुछ अपडेट करते हैं (सर्वर-साइड कोड में), नियंत्रण दिखाएं और एक सार्थक "सफल" सेट करें! संदेश शब्द।
  • एक कस्टम जावास्क्रिप्ट फ़ंक्शन पंजीकृत करें जो <div> को देखेगा और इसे प्रत्येक पृष्ठ सबमिट पर छिपाएगा। ध्यान रखें कि फ़ंक्शन को स्वत: जेनरेट की गई क्लाइंट स्क्रिप्ट से पहले कॉल करने की आवश्यकता है जो सत्यापन करता है।

आप एक ASP.NET पेज (इस पर प्रमाणकों के साथ) के ग्राहक स्रोत को देखें, तो यहाँ तुम क्या मिल सकता है:

<form name="aspnetForm" method="post" action="MyPage.aspx" onsubmit="javascript:return WebForm_OnSubmit();id="aspnetForm">

WebForm_OnSubmit ASP.NET और से उत्पन्न होता है जावास्क्रिप्ट को कॉल करता है जो सत्यापन करता है। नमूना:

function WebForm_OnSubmit() { 
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) 
    return false; 
return true; 
} 

कि सफलता संदेश छुपाता अपने कस्टम कोड रजिस्टर करने के लिए, आप इन पंक्तियों के साथ कुछ (अपने कोड-पीछे में) जगह चाहिए:

if (!Page.ClientScript.IsOnSubmitStatementRegistered("ClearMessage")) 
{ 
    string script = @"document.getElementById('" + 
     yourDivControl.ClientID + "').style.display='none'"; 
    Page.ClientScript.RegisterOnSubmitStatement(Page.GetType(), "ClearMessage", script); 
} 

इस में अपने पृष्ठ के स्वत: जनरेट की WebForm_OnSubmit बदल जाएगी निम्नलिखित:

function WebForm_OnSubmit() { 
    document.getElementById('ctl00_yourDivControl').style.display='none'; 
    if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) 
     return false; 
    return true; 
} 

प्रभाव: हर पोस्टबैक पर (जैसे जब ItemCommand शुरू हो रहा है, या जब कुछ सहेजें बटन क्लिक किया जाता है, या anyt हिंग अन्य), आप "सफलता" संदेश के साथ div नियंत्रण दिखाएंगे। अगले पोस्टबैक पर, सर्वर को पृष्ठ सबमिट करने से पहले, यह संदेश साफ़ कर दिया गया है। बेशक, अगर यह पोस्टबैक "सफलता" भी ट्रिगर करता है, तो संदेश सर्वर पर कोड-बैक द्वारा फिर से दिखाया जाता है। इत्यादि इत्यादि।

मुझे उम्मीद है कि उपरोक्त सहायक है। यह पूर्ण उड़ा समाधान नहीं है, लेकिन यह आपको सही दिशा में इंगित करने के लिए पर्याप्त संकेत देता है।

+0

पवित्र बकवास, यह एक लमर वास्तविकता है जो मैंने कभी कल्पना की थी, लेकिन एक शानदार जवाब। मुझे लगता है कि मैं हर बार सर्वर पर वापस जाने के लिए सत्यापन को भी मजबूर कर सकता हूं। तुम एक चैंपियन हो – danieltalsky

+0

एक और संकेत जो उपयोगी हो सकता है: आप अपने मास्टर पेज में उपरोक्त सभी चीजें कर सकते हैं (मान लें कि आप एएसपी.नेट 2.0 का उपयोग करते हैं)। यही है, आप सामग्री के ऊपर सीधे div नियंत्रण रख सकते हैं, और वहां जानकारी संदेश प्रदर्शित कर सकते हैं (जारी ...) –

+0

आप मास्टरपेज-व्युत्पन्न ऑब्जेक्ट में एक SetMessage() सार्वजनिक विधि का पर्दाफाश करते हैं और आपको "जानकारी संदेश" समर्थन मिलता है '((माईमास्टर) पेज.मास्टर) का उपयोग करके, इस मास्टर पेज का उपयोग करने वाले सभी पृष्ठों के लिए .सेट मैसेज (" सफलता ")'; –

1

आइटम कमांड ईवेंट का उपयोग करें और दिए गए प्रत्येक आदेश के लिए राज्य को साफ़ करने के लिए रीसेट करें। फिर यदि सत्यापन अद्यतन पर विफल रहता है, तो सत्यापन त्रुटि प्रदर्शित की जाएगी। यदि यह सफल होता है, तो यह सफलता संदेश दिखाएगा। इसके बाद, बटन क्लिक आइटम कॉमांड ईवेंट का आह्वान करेंगे और आप ताजा शुरू करने के लिए फिर से रीसेट कर सकते हैं।

+0

मैंने यह कोशिश की, लेकिन ऐसा लगता है कि वास्तव में लेबल को संपादन में दूसरी कोशिश पर अदृश्य नहीं लगता है जो सत्यापन विफलता को ट्रिगर करता है। – danieltalsky

+0

क्या आपके पास क्लाइंट-साइड सत्यापन सक्षम है? यदि ऐसा है, तो आपको जावास्क्रिप्ट के साथ सफलता संदेश छिपाने की आवश्यकता होगी। – tvanfosson

0

पेज_लोड में सत्यापन संदेश क्यों बंद नहीं करें। मुझे लगता है कि यदि कोई पोस्ट बैक होता है तो आप संदेश से छुटकारा पाना चाहते हैं, इसलिए सुनिश्चित करें कि यह हमेशा बंद रहता है। या मार्कअप (एएसपीएक्स पेज) में EnableViewState = "गलत" सेट करके नियंत्रण के लिए दृश्य स्थिति अक्षम करें।

तो:

protected void ClearMessages(object sender, DetailsViewCommandEventArgs e) 
{ 
    successMessage.InnerText = string.Empty;  
    successMessage.Visible = false; 
} 

हो जाता है:

protected void Page_Load(object sender, EventArgs e) 
{ 
    successMessage.InnerText = string.Empty;  
    successMessage.Visible = false; 

} 

इसके अलावा एक तरफ ध्यान दें के रूप में यदि आप buiding।नेट साइट्स जिन्हें आपको कोड के पीछे कॉम्फोर्बल प्राप्त करने की आवश्यकता है IMHO :-)

+0

मैं कोड-बैक के साथ पूरी तरह से सहज हूं, लेकिन यह एक बहुत ही सरल वेब एप्लिकेशन है, और मैंने जितना संभवतः मूल एएसपी.NET टैग का उपयोग कर सकता है, उतना करने का एक डिज़ाइन निर्णय लिया। यह सुंदर है, और ईमानदारी से मुझे इससे पहले कोड के पीछे चाटना नहीं लिखना पड़ा। – danieltalsky

+0

और, दुख की बात है, यह नौकरी नहीं करता है। जब मैं अपना सत्यापन संदेश ट्रिगर करता हूं, तो सफलता संदेश रहता है। मैंने EnableViewState को बंद करने का भी प्रयास किया। – danieltalsky

1

डैनियल, मुझे कुछ ऐसा ही चाहिए, इसलिए मैंने लेबल से लिया और इसे सीधे डेटासोर्स कंट्रोल डेरिवेटिव्स (लिंककटासोर्स, ऑब्जेक्टडेटा स्रोत, एसक्लडाटासोर्स) द्वारा उठाए गए कार्यक्रमों तक सीमित कर दिया। मैंने प्रमाणीकरण और/या फॉर्म सबमिशन (जैसे Dan.C के उत्तर) के दौरान लेबल को छिपाने के लिए क्लाइंट-साइड जावास्क्रिप्ट का भी उपयोग किया।

नियंत्रण सफल हटाए गए, सम्मिलित और अपडेट किए गए ईवेंट के लिए अलग संदेश टेक्स्ट गुणों का खुलासा करता है।

मैं कम से http://codehq.net/files/UpdateSuccessMessage.zip

आशा इस मदद करता है समाधान के लिए टिप्पणी की स्रोत प्रकाशित किया है।

+0

आपके उत्तर के लिए धन्यवाद। मैं कोड डाउनलोड कर रहा हूं और इसकी समीक्षा कर रहा हूं। मैंने अभी भी कुछ लागू करने को समाप्त नहीं किया है, लेकिन मेरे उपयोगकर्ता इसके लिए पूछना शुरू कर रहे हैं। मैं किसी प्रकार के jQuery "फीडआउट" समाधान पर योजना बना रहा था, लेकिन मैं तुम्हारी जांच कर रहा हूं। – danieltalsky

संबंधित मुद्दे

 संबंधित मुद्दे