2011-06-09 12 views
5

मैं एक कस्टम नियंत्रण के व्यूस्टेट में Dictionary<string, string> स्टोर करने की कोशिश कर रहा हूं, मैं एएसपी.NET 2.0 के लिए विकसित कर रहा हूं:ASP.NET दृश्य स्थिति में <string, string> शब्दकोश संग्रहीत करना?

private Dictionary<String, String> Items 
    { 
     get 
     { 
      object d = ViewState["Items"]; 
      return (d == null ? null : (Dictionary<String, String>)d); 
     } 
     set 
     { 
      ViewState["Items"] = value; 
     } 
    } 

इसे एक्सेस करना इस तरह दिखता है:

public void UpdateData 
{ 
    if (this.Items == null) 
     this.Items = new Dictionary<string, string>(); 
    else 
     this.Items.Clear(); 
    //Fill the collection 
} 

जब यह सेट हो जाता है पृष्ठ लोड होने पर पहली बार, यह ठीक काम करता प्रतीत होता है। लेकिन बाद के पोस्टबैक पर, लौटाया गया मूल्य हमेशा शून्य होता है (पहली स्थिति हमेशा होती है)। डिबगिंग से पता चलता है कि यह get संपत्ति get में व्यूस्टेट से बाहर हो रहा है।

मैंने कुछ शोध किया है और found है कि कक्षाओं को ViewState में सहेजने योग्य IStateManager को लागू करना होगा, और Dictionary MSDN page यह इंगित करता है कि Dictionary<TKey, TValue> नहीं है। लेकिन मैंने बिना किसी समस्या के व्यूस्टेट में शब्दकोशों को संग्रहीत किया है। यहाँ क्या चल रहा है? क्या मेरा पिछला अनुभव एक झटका था?

अद्यतन: मैंने संपत्ति में कुछ टेस्ट कोड जोड़ने का प्रयास किया: setset में set और string test = (string)ViewState["ItemTest"]; में string test = (string)ViewState["ItemTest"];। Xzx47 की तरह, यह शून्य से बाहर आता है। तो यह Dictionary serializable होने के साथ एक समस्या प्रतीत नहीं होता है। इसके अलावा, स्पष्टीकरण के लिए, UpdateData को मेरे RenderControl ओवरराइड से बुलाया जाता है, जो उस पृष्ठ में Page_Load के बाद होता है जिसमें नियंत्रण होता है।

+2

आप मूल्यों फ़ॉट कहाँ जाँच कर रहे हैं? मेरा मानना ​​है कि 'इनिट' घटना के बाद व्यूस्टेट लोड हो जाता है। – keyboardP

+0

लौटने से पहले शून्य की जांच में? पहली बार पृष्ठ लोड होने पर, वहां कोई मूल्य नहीं होने वाला है। –

+0

क्या आपके नियंत्रण में आपके नियंत्रण में स्थिर या गतिशील जोड़ा गया है? – ibram

उत्तर

8

आप ViewState में शब्दकोश स्टोर कर सकते हैं, लेकिन आप इस पेज जीवन चक्र में बहुत देर हो चुकी करने की कोशिश कर रहे हैं। बस के रूप में ViewState Init के बाद भरी हुई है, ViewState में सहेजा गया है से पहले नियंत्रण बनाए जाते हैं। अपने तर्क को RenderControl से बाहर ले जाएं और जीवन चक्र में पहले किसी अन्य विधि या ईवेंट हैंडलर में PreRender पर जाएं।

protected override void OnPreRender(EventArgs e) 
{ 
    if (this.Items == null) 
    { 
     this.Items = new Dictionary<string, string>(); 
    } 

    base.OnPreRender(e); 
} 

आप देखेंगे कि वस्तु के रूप में लंबे समय के रूप ViewState नियंत्रण अथवा अपनी मूल पर अक्षम नहीं किया जा रहा है अब और नहीं अशक्त बाद Postbacks पर है।

+0

ठीक है, इसे फिर से जांच लिया। तुम सही हो। –

1

सुनिश्चित करें कि आप पृष्ठ जीवन चक्र में बहुत जल्दी प्रॉपर्टी एक्सेस नहीं कर रहे हैं के रूप में viewstate सीधे लोड नहीं किया गया है।

क्या विधि से

(पेज जीवन चक्र में जो बिंदु पर) यदि आप पहली बार इस संपत्ति अनुरोध कर रहे हैं?

+0

इसे 'रेंडरकंट्रोल' ओवरराइड से बुलाया जा रहा है, जो मुझे विश्वास है कि 'पेज_लोड' के बाद है, इसलिए यह वहां होना चाहिए। –

+0

हो सकता है कि आपको एक स्ट्रिंग को उसी तरह से स्ट्रिंग और बस स्टोर करना चाहिए, देखें कि पोस्टबैक के बाद वह भी शून्य है या नहीं। यदि यह शून्य है तो आपको पृष्ठ जीवन चक्र के साथ शायद समस्या हो सकती है। यदि यह खाली नहीं है जो समस्या को कम कर देगा। – thekip

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