2008-09-05 15 views
7

मेरे पास एक जटिल पृष्ठ है जो गतिशील रूप से दोहराना के अंदर उपयोगकर्ता नियंत्रण बनाता है। यह दोहराना ViewState से पहले इनिट पेज ईवेंट के दौरान बाध्य होना चाहिए या गतिशील रूप से बनाए गए उपयोगकर्ता नियंत्रण उनके राज्य को बनाए रखेंगे।जब आप व्यूस्टेट का उपयोग नहीं कर सकते तो आप क्या करते हैं?

यह एक दिलचस्प कैच -22 बनाता है क्योंकि ऑब्जेक्ट मैं दोहराने वाला ऑब्जेक्ट प्रारंभिक पृष्ठ लोड पर बनाने की आवश्यकता है, और तब तक स्मृति में तब तक जारी रहता है जब तक उपयोगकर्ता छोड़ने या सहेजने का विकल्प नहीं चुनता।

क्योंकि मैं इस ऑब्जेक्ट को स्टोर करने के लिए ViewState का उपयोग नहीं कर सकता, फिर भी यह इनिट के दौरान उपलब्ध है, मुझे इसे सत्र में स्टोर करने के लिए मजबूर किया गया है।

इसमें भी समस्याएं हैं, क्योंकि ViewState काम करने के अनुकरण के लिए मुझे गैर-पोस्टबैक के दौरान सत्र मूल्य को स्पष्ट रूप से शून्य करना होगा।

इस परिदृश्य में राज्य प्रबंधन के लिए एक बेहतर तरीका होना चाहिए। कोई विचार?

संपादित करें:LoadViewState का उपयोग करने के बारे में कुछ अच्छे सुझाव, लेकिन मुझे अभी भी स्थिति के साथ समस्याएं हैं जब मैं ऐसा करता हूं।

यहाँ कुछ हद तक अगर पेज संरचना

पृष्ठ है -> UserControl -> पुनरावर्तक -> UserControls की एन राशि dynamicly बनाया गया।

मैंने पैरेंटपर LoadViewState को ओवरराइड किया है, क्योंकि इसे पूरी तरह से encapsulated और उस पृष्ठ से स्वतंत्र होने के लिए डिज़ाइन किया गया है। मैं सोच रहा हूं कि वह समस्या है जहां समस्या है।

उत्तर

1

इसमें भी समस्याएं हैं, क्योंकि मुझे व्यूस्टेट कैसे काम करता है इसका अनुकरण करने के लिए मुझे गैर-पोस्टबैक के दौरान सत्र मूल्य को स्पष्ट रूप से शून्य करना होगा।

आप को स्पष्ट रूप से मूल्य बाहर अशक्त (स्मृति प्रबंधन से अलग, आदि) क्यों है करते हैं? क्या यह पेज। आईएस पोस्टबैक की जांच करने का विकल्प नहीं है, और या तो सत्र चर के साथ कुछ करता है या नहीं?

1

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

0

@DancesWithBamboo:

मैं गतिशील नियंत्रण वहाँ बाँध हैं, ASP.NET स्वचालित रूप से उनके राज्य को संभाल लेंगे? पेज_लोड में ऐसा करने में समस्या यह है कि व्यूस्टेट पहले ही लोड हो चुका है और यह पुनरावर्तक में गतिशील नियंत्रण नहीं जोड़ता है। मुझे लगता है कि यह LoadViewState में भी ऐसा ही करेगा?

+0

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

0

1) शायद इसे काम करने के लिए एक तरीका है ... आपको बस सही समय पर पेड़ पर अपने नियंत्रण जोड़ना सुनिश्चित करना होगा। बहुत जल्द और आपको व्यूस्टेट नहीं मिलता है। बहुत देर हो चुकी है और आपको व्यूस्टेट नहीं मिलता है।

2) यदि आप इसे समझ नहीं सकते हैं, तो हो सकता है कि आप छेद पृष्ठ के लिए व्यूस्टेट बंद कर सकें और फिर केवल राज्य परिवर्तनों के लिए क्वेरीस्ट्रिंग पर भरोसा कर सकते हैं? कोई भी लिंक जो पहले पोस्टबैक था, एक अन्य यूआरएल (या एक पोस्टबैक-रीडायरेक्ट) का लिंक होगा।

यह वास्तव में पृष्ठ के वजन को कम कर सकता है और व्यूस्टेट के साथ समस्याओं से बचने में आसान बना सकता है।

0

@Jonathan:

हाँ, क्रम जब तक आप उनमें से सही संख्या बनाने के रूप में नियंत्रण के viewstate बस जाएँगे। इस घटना के बाद नियंत्रण 'व्यूस्टेट पॉप्युलेट होगा।

0

हां, रनटाइम नियंत्रण के दृश्यस्थल को तब तक तैयार करेगा जब तक आप उनमें से सही संख्या बनाते हैं। इस घटना के बाद नियंत्रण 'व्यूस्टेट पॉप्युलेट होगा।

लोडव्यूस्टेट किस क्रम में कहा जाता है? मैंने एक ओवरराइड विधि हस्ताक्षर जोड़ा और ऐसा लगता है कि इसमें कदम नहीं है।

0
protected override void LoadViewState(object savedState) 
{ 
    // Put your code here before base is called 
    base.LoadViewState(savedState); 
} 

क्या आपका मतलब क्या है? या क्या आपका मतलब है कि नियंत्रण किस क्रम में संसाधित होते हैं? मुझे लगता है कि इसका जवाब यह अर्ध-यादृच्छिक है।

इसके अलावा, आप पेज_लोड से पहले उन वस्तुओं को क्यों लोड नहीं कर सकते हैं जिन्हें आप बांधते हैं? पेज लाइफसाइक्ल के दौरान किसी भी समय अपनी व्यावसायिक परत को कॉल करना ठीक है, यदि आपको प्री-रेंडर और कुछ भी बाद के अपवाद के साथ करना है।

0

मैं स्पष्ट रूप से करने के क्रम में गैर Postbacks दौरान सत्र मूल्य शून्य पर अनुकरण कैसे ViewState काम करता है।

मैं अभी भी धुंधला हूं कि आप सत्र में किसी भी ऑब्जेक्ट को बाध्यकारी क्यों नहीं स्टोर कर सकते हैं। यदि आप सत्र में उस ऑब्जेक्ट को स्टोर कर सकते हैं तो निम्नलिखित कार्य करना चाहिए:

  1. पहले लोड पर OnPreInit के दौरान ऑब्जेक्ट पर अपने शीर्ष उपयोगकर्ता नियंत्रण को बाध्य करें। ऑब्जेक्ट को सत्र में स्टोर करें। व्यूस्टेट स्वचालित रूप से उन नियंत्रणों के लिए संग्रहीत किया जाएगा। यदि आपको पेज_लोड पर पहली बार नियंत्रण को बाध्य करना है, तो ठीक है, लेकिन यदि आप अगले चरण का पालन करते हैं तो आप दो घटनाओं को समाप्त कर देंगे।
  2. पोस्टबैक पर, सत्र में संग्रहीत ऑब्जेक्ट के विरुद्ध OnPreInit विधि में अपने शीर्ष उपयोगकर्ता उपयोगकर्ता नियंत्रण को दोबारा दर्ज करें। आपके सभी नियंत्रण व्यूस्टेट लोड से पहले पुनर्निर्मित किए जाने चाहिए। फिर जब व्यूस्टेट बहाल किया जाता है, तो मूल्य दृश्यमान में जो भी हो, पर सेट किया जाएगा। यहां एकमात्र चेतावनी यह है कि जब आप पोस्टबैक पर फिर से बांधते हैं, तो आपको 100% सुनिश्चित करना होगा कि नियंत्रण की एक ही संख्या फिर से बनाई गई है। रिपियटर्स, ग्रिडव्यू इत्यादि का उपयोग करने की कुंजी ... उनके अंदर गतिशील नियंत्रण के साथ है कि वे में व्यूस्टेट लोड होने से पहले प्रत्येक पोस्टबैक पर रिबाउंड होने के लिए है। OnPreInit आमतौर पर ऐसा करने के लिए सबसे अच्छी जगह है। ढांचे में कोई तकनीकी बाधा नहीं है जो निर्देश देती है कि आपको पहले लोड पर पेज_लोड में अपना पूरा काम करना होगा।

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

क्या मुझे आपकी स्थिति के बारे में कुछ स्पष्ट जानकारी याद आ रही है? मुझे पता है कि कोड पोस्ट किए बिना स्थिति की सूक्ष्मताओं को समझाना बहुत मुश्किल हो सकता है।

संपादित करें: मैंने इस समाधान में OnInit से OnPreInit के सभी संदर्भों को बदल दिया है।मैं भूल गया कि एमएस ने इस नए कार्यक्रम को एएसपी.नेट 2.0 में पेश किया था। उनके page lifecycle documentation के अनुसार, OnPreInit वह जगह है जहां गतिशील नियंत्रण बनाया/बनाया जाना चाहिए।

0

गतिशील नियंत्रण बनाते समय ... मैं केवल उन्हें प्रारंभिक लोड पर पॉप्युलेट करता हूं। बाद में मैं पेज लोड इवेंट में पोस्टबैक पर नियंत्रण फिर से बना देता हूं, और व्यूस्टेट किसी भी समस्या के साथ मूल्यों को दोबारा बदलने में संभालता है।

4

पृष्ठ पर लोडव्यूस्टेट विधि निश्चित रूप से उत्तर है।

protected override void LoadViewState(object savedState) { 
    var savedStateArray = (object[])savedState; 

    // Get repeaterData from view state before the normal view state restoration occurs. 
    repeaterData = savedStateArray[ 0 ]; 

    // Bind your repeater control to repeaterData here. 

    // Instruct ASP.NET to perform the normal restoration of view state. 
    // This will restore state to your dynamically created controls. 
    base.LoadViewState(savedStateArray[ 1 ]); 
} 

SaveViewState savedState सरणी कि हम ऊपर प्रयोग कर रहे हैं बनाने के लिए की जरूरत है:: यहाँ सामान्य उपाय दिया गया

protected override object SaveViewState() { 
    var stateToSave = new List<object> { repeaterData, base.SaveViewState() }; 
    return stateToSave.ToArray(); 
} 

मत भूलना भी Init में पुनरावर्तक बाँध या इस तरह कोड का उपयोग कर लोड करने के लिए:

if(!IsPostBack) { 
    // Bind your repeater here. 
} 
संबंधित मुद्दे

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