2008-10-17 6 views
5

पर ईवेंट सत्यापन त्रुटि उत्पन्न हुई है। मैंने एक आइटम स्वैपर नियंत्रण बनाया है जिसमें दो सूची बॉक्स और कुछ बटन शामिल हैं जो मुझे दो सूचियों के बीच आइटम स्वैप करने की अनुमति देते हैं। स्वैपिंग जावास्क्रिप्ट का उपयोग करके किया जाता है। मैं सूची में वस्तुओं को ऊपर और नीचे भी ले जाता हूं। असल में जब मैं आइटम को दाईं ओर सूची बॉक्स में ले जाता हूं तो मैं एक छिपे हुए क्षेत्र में तत्वों (GUIDs) के डेटाकेस को संग्रहीत करता हूं। पोस्टबैक पर मैं बस मैदान से GUID पढ़ता हूं। सबकुछ बढ़िया काम करता है लेकिन पोस्टबैक पर, मुझे निम्नलिखित अपवाद मिलता है:पोस्टबॉक्स तत्वों को जावास्क्रिप्ट के साथ पुनर्व्यवस्थित किया गया है जिससे पोस्टबैक

अमान्य पोस्टबैक या कॉलबैक तर्क। इवेंट सत्यापन को कॉन्फ़िगरेशन या <% @ पृष्ठ सक्षम करें EventValidation = "true"%> पृष्ठ में सक्षम किया गया है। सुरक्षा उद्देश्यों के लिए, यह सुविधा सत्यापित करती है कि पोस्टबैक या कॉलबैक ईवेंट के तर्क मूल रूप से उन्हें प्रदान किए गए सर्वर नियंत्रण से उत्पन्न होते हैं। यदि डेटा मान्य और अपेक्षित है, तो सत्यापन के लिए पोस्टबैक या कॉलबैक डेटा पंजीकृत करने के लिए क्लाइंटस्क्रिप्ट प्रबंधक। रजिस्ट्रारफॉरवेन्ट वैलिडेशन विधि का उपयोग करें।

मैंने एक परीक्षण आवेदन तैयार किया है। आपको बस इतना करना है कि संग्रह डाउनलोड करें और प्रोजेक्ट चलाएं। वेब पेज पर 3 आइटम का चयन करें, सभी जोड़ें दबाएं, फिर तीसरे तत्व को एक स्तर पर ले जाएं और फिर "बटन" दबाएं। त्रुटि दिखाई देगी। इवेंट सत्यापन बंद करना किसी भी तरह से स्वीकार्य नहीं है। क्या कोई मेरी मदद कर सकता है, मैंने समाधान खोजने के बिना पहले से ही दो दिन बिताए हैं।

TEST APPLICATION

+0

FYI करें: मैं आपका एप्लिकेशन डाउनलोड किया है और कभी नहीं यह त्रुटि आई - मैं था, हालांकि, एक त्रुटि के बारे में col1 डेटा तालिका, या ऐसा ही कुछ (अभी इसे नहीं देख) का एक हिस्सा नहीं किया जा रहा हो। आप यह सुनिश्चित करने के लिए जांचना चाहेंगे कि आपका उदाहरण इस त्रुटि का कारण बनता है, क्योंकि यह मेरे लिए नहीं है। –

+0

इसके अलावा, आगे बढ़ने वाला 'आगे बढ़ना' फ़ायरफ़ॉक्स में बिल्कुल भी काम नहीं करता है, तो आप इसका उल्लेख करना चाहेंगे या इसे ठीक कर सकते हैं। –

+0

col1 के साथ त्रुटि गंतव्य DT.Columns.Add ("coluID", टाइपऑफ (Guid) के कारण हुई है; और गंतव्य डीटी। कॉलम। जोड़ें ("col1", टाइपऑफ (स्ट्रिंग)); जिन्हें केवल पोस्ट पर नहीं कहा जाता है, लेकिन जब बटन क्लिक किया जाता है तो इसकी आवश्यकता होती है। – Aleris

उत्तर

0

पहला विकल्प काफी ओवरहेड लाएगा। मैं अपने स्वयं के कस्टम लिस्टबॉक्स लिस्टबॉक्स वर्ग से प्राप्त नियंत्रण परिभाषित और loadpostback डेटा की एक ओवरराइड प्रदर्शन किया है:

public class CustomListBox : ListBox 
{ 
    protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection) 
    { 
     return true; 
    } 
} 

मेरे उपयोगकर्ता नियंत्रण में नियमित लिस्टबॉक्स के बजाय इस समस्या का समाधान का उपयोग करते हुए, फिर भी जुड़े जोखिमों को देखते हैं मेरे दृष्टिकोण के साथ?

+0

यदि आप ऐसा करते हैं तो आप शायद झूठी वापसी करना चाहते हैं - सत्य लौटने से चयनित इंडेक्स हमेशा आग लगने का कारण बन जाएगा, लेकिन चूंकि आपने पोस्ट डेटा से चयनित इंडेक्स को पॉप अप करने वाले बिट को ओवरराइड कर दिया है, यह वास्तव में कभी भी नहीं बदलेगा। – stevemegson

0

यह शिकायत है क्योंकि एक सूची में चयनित आइटम जब यह गाया गया था नहीं था सूची में मौजूद। पोस्टबैक की बजाय अपने डेटा को अपने फॉर्म पर वापस लाने के लिए AJAX के माध्यम से PageMethods का उपयोग करने पर विचार करें। या डेटा को पकड़ने के लिए एक गैर इनपुट नियंत्रण का उपयोग करें - जैसे कि अनियंत्रित सूचियां जो आप सूची तत्वों को आगे और आगे ले जाते हैं। आप GUID को सूची तत्व के अंदर छिपे हुए स्पैन में डाल सकते हैं जहां आवश्यकता होने पर आप उन्हें प्राप्त कर सकते हैं।

+0

हालांकि अगर मैं बायीं तरफ सूची में तत्वों को दाईं ओर दाईं ओर ले जाता हूं और फिर उनके ऑर्डर को बदल दिए बिना पोस्टबैक (ऊपर या नीचे) सब कुछ ठीक है। इस मामले में, पृष्ठ को लिखे जाने की तुलना में पोस्टबैक पर दो सूचियां अलग नहीं हैं? – kjv

+0

अधिक सटीक, यह शिकायत कर रहा है क्योंकि सूची में चयनित मूल्य सूची में मौजूद नहीं था जब पृष्ठ लिखा गया था। आइटम जोड़ना ठीक है, लेकिन उन्हें पुन: व्यवस्थित करने से आइटम को चुना जाता है और इसलिए समस्या का कारण बनता है। – stevemegson

+0

समस्या का निश्चित विवरण। – tvanfosson

3

समस्या यह है कि सूची की सहेजी गई दृश्य स्थिति और पोस्टबैक पर प्राप्त डेटा मेल नहीं खाता है। इवेंट सत्यापन समस्या सबसे अधिक संभावित समस्याओं में से एक है जो इस दृष्टिकोण के कारण दिखाई दे सकती है। वेबफॉर्म का आर्किटेक्चर इस तरह के उपयोग की अनुमति नहीं देता है और, संभवतः, इस दृष्टिकोण के साथ और अधिक समस्याएं हो सकती हैं, भले ही आप ईवेंट सत्यापन समस्या से बचने में सफल हों। आपके पास कई विकल्प हैं:

1) जावास्क्रिप्ट का उपयोग करने के बजाय सर्वर पर स्वैपिंग तर्क करना सबसे आसान है। इस तरह व्यू स्टेटस को पोस्टबैक के बीच संरक्षित किया जाएगा और सर्वर पर एकाधिक राउंड ट्रिप के अतिरिक्त ओवरहेड एक मुद्दा नहीं हो सकता है।

2) यदि सर्वर के लिए एकाधिक राउंड ट्रिप एक समस्या है, तो एक सर्वर नियंत्रण लिखें जो इसे स्वयं का दृश्य स्थिति संभालता है। यह निश्चित रूप से एक बहुत ही आकर्षक दृष्टिकोण है।

3) एक मध्यम ग्राउंड दृष्टिकोण दो सरल HTML सूचियों का उपयोग करना हो सकता है (केवल एएसपीनेट नियंत्रणों का उपयोग किए बिना एचटीएमएल टैग लिखें) और क्लाइंट पक्ष को जावास्क्रिप्ट से आईडी के एक छिपे हुए क्षेत्र में बनाए रखें। पोस्ट पर वापस छिपे हुए क्षेत्र को पार्स करें और आईडी को एचटीएमएल सूचियों को अनदेखा कर निकालें।

यदि मैं इसके खिलाफ गंभीर तर्क नहीं देता तो मैं 1 के साथ जाऊंगा।

1

कुछ संभव विकल्प:

  • संभव हो तो, दो सूचियों पर ViewState को अक्षम करें। व्यूस्टेट के बिना, सर्वर नहीं जानता कि मूल मान क्या थे और इसलिए त्रुटि नहीं होगी। इस दृष्टिकोण के साथ, आपको सूचियों को पुनर्स्थापित करना होगा (व्यूस्टेट की कमी के कारण) और चयन को मैन्युअल रूप से ट्रैक करने की आवश्यकता हो सकती है - या ऑनइनिट चरण के दौरान सूचियों को पॉप्युलेट करने की आवश्यकता होगी।

  • घटना सत्यापन को बंद कर दें (यदि आप कर सकते हैं)

  • सर्वर साइड पर दोनों सूचियों आबाद पूरी तरह से और के रूप में आवश्यक दो प्रविष्टियों को निकाल सकते करने के लिए क्लाइंट साइड स्क्रिप्ट (जावास्क्रिप्ट) का उपयोग करें।

0

मौका से, क्या आपने इसे पहले से ही आजमाया है? जब भी आप किसी भी तरह से सूची में फंस जाते हैं तो ऐसा करें।

document.getElementById("listbox").selectedIndex = -1; 
0

वैकल्पिक रूप से, आप घटना सत्यापन समस्या के समाधान के लिए एक ListBox के स्थान पर एक सर्वर साइड HtmlSelect उपयोग कर सकते हैं। सबसे अच्छा, आप अपने अधिकांश कोड-पीछे बरकरार रखने में सक्षम हो सकते हैं (यानी सूची जनसंख्या तर्क सूची बॉक्स के समान है)।

<select runat="server" id="myList" multiple="true" /> 
0

आप दोनों संभावित सूचीबॉक्स आइटमों को सूचीबॉक्सों के साथ पंजीकृत करने के लिए रेंडर ईवेंट को ओवरराइड कर सकते हैं। इस तरह कोई फर्क नहीं पड़ता कि वस्तुओं को स्थानांतरित किया जाता है, जहां सत्यापन उन्हें उम्मीद कर रहा है।

protected override void Render(HtmlTextWriter writer) 
{ 
    foreach (DictionaryEntry entry in ColumnConfig) {   
    Page.ClientScript.RegisterForEventValidation(lstbxColumnsToExport.UniqueID,(string)entry.Key); 
    Page.ClientScript.RegisterForEventValidation(lstbxNonExportColumns.UniqueID,(string)entry.Key); 
    } 
    base.Render(writer); 
}