2009-11-20 6 views
6

मेरी ASP.NET अनुप्रयोग में, मैं एक .ascx गतिशील LoadControl का उपयोग कर लोड हो रहा हूँ, तो निम्न पद्धति का उपयोग कर:Viewstate Postbacks के बीच खो दिया

var ctrl = LoadControl("/path/to/control.ascx"); 
((ControlType)ctrl).SomeProperty = someData; 
placeholder.Controls.Add(ctrl); 

नियंत्रण मैं जोड़ने कि सीधे SomeProperty संपत्ति के मूल्य की बचत होती है व्यूस्टेट, निम्नानुसार है:

public int? SomeProperty 
{ 
    get { return (int?)ViewState["SomeProperty"]; } 
    set { ViewState["SomeProperty"] = value; } 
} 

उसके बाद, एसीएक्स नियंत्रण अपने जीवन पर रहता है और पोस्टबैक होने तक सभी ठीक है। जब पृष्ठ वापस पोस्ट होता है, अचानक दृश्य स्थिति खाली होती है! मुझे संदेह है कि ऐसा होता है क्योंकि मैं अपने पृष्ठ पर तत्काल एसीएक्स जोड़ने से पहले व्यूस्टेट में हेरफेर करता हूं। इसके अलावा, मैं अपने ascx नियंत्रण से Page_Load() विधि में निम्न पंक्ति जोड़कर खो रहा से ViewState रोका जा सकता है:

SomeProperty = SomeProperty; 

मैं यह सुनिश्चित करें कि ViewState संरक्षित है प्रत्येक और हर संपत्ति के लिए ऊपर क्या करना है। अब, ऐसा करने का एक सुंदर तरीका है? तत्काल के बाद व्यूस्टेट को मैनिपुलेट करना। पृष्ठ पर जोड़ा गया है। एक्सएक्स एक विकल्प नहीं है - मुझे Page_Init() और Page_Load() विधियों में व्यूस्टेट की सामग्री की आवश्यकता है, जो तुरंत मेरे पृष्ठ पर .ascx जोड़ते हैं।

धन्यवाद।

+0

मुझे एक बार एक ही समस्या का सामना करना पड़ा, और मेरे मामले में समस्या यह थी कि हमारे सर्वकालिक बेसपेज में, हम सभी नियंत्रणों को व्यूस्टेट का उपयोग न करने के लिए सेट करते हैं। मेरा मुद्दा यह है कि नियंत्रण जोड़ना गतिशील रूप से समस्या नहीं हो सकता है, लेकिन छुपे हुए स्थान जहां व्यूस्टेट अक्षम करने के लिए सेट है। –

उत्तर

13

ASP.NET Page Life Cycle और Understanding View State पर एक नजर डालें। देखें प्रारंभ होने के बाद राज्य लोड हो जाता है, इसलिए आप इसे Page_Init में एक्सेस नहीं कर पाएंगे। आप एक छिपे हुए क्षेत्र का उपयोग बंद कर देंगे।

यदि आप व्यू स्टेट का उपयोग करने पर मृत सेट हैं, तो सबसे पहले आप इसे प्राप्त कर सकते हैं LoadViewState विधि ओवरराइड करके (base.LoadViewState को कॉल करने से पहले इसे कॉल करने से पहले याद रखें)।

+0

+1 अच्छा संदर्भ w/स्पष्टीकरण –

+0

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

+0

ओह यदि आप छिपे हुए फील्ड दृष्टिकोण के साथ जाते हैं तो आपको मूल्य के लिए 'Request.Forms' में देखना होगा। वास्तविक सर्वर नियंत्रण अभी तक लोड नहीं किया जाएगा। कोशिश करो। – Bob

1

पोस्टबैक पर तो पोस्टबैक से पहले UserControl की आईडी पर नज़र रखें नियंत्रण फिर से बना सकते हैं और आईडी वापस आवंटित और यह अपने आप ViewState में वापस लोड करना चाहिए।

+0

ओह, हाँ, मैं यह कहना भूल गया था। मैं वास्तव में प्रत्येक पोस्टबैक पर उपयोगकर्ता नियंत्रण को फिर से बना देता हूं, और मैं सुनिश्चित करता हूं कि आईडी हर बार एक जैसी है। समस्या यह नहीं है कि व्यूस्टेट को पुनर्स्थापित नहीं किया जा सकता है, यह लोडकंट्रोल और प्लेसहोल्डर के बीच व्यूस्टेट में परिवर्तन करता है। नियंत्रण तब तक जारी नहीं है जब तक कि पृष्ठ में नियंत्रण को जोड़ने के बाद मैं स्पष्ट रूप से परिवर्तनों को दोहराता हूं। –

3

आपको संपत्ति सेट करने से पहले नियंत्रण संग्रह में नियंत्रण जोड़ने की भी आवश्यकता है। नियंत्रण संग्रह में जोड़े जाने के बाद व्यूस्टेट रिकॉर्ड नहीं किया जाता है।

placeholder.Controls.Add(ctrl); 
((ControlType)ctrl).SomeProperty = someData; 
संबंधित मुद्दे