2009-07-24 15 views
21

उपयोगकर्ता नियंत्रण में संपत्ति मानों को बनाए रखने का एकमात्र तरीका व्यूस्टेट का उपयोग करना है।उपयोगकर्ता नियंत्रण (ascx) और गुण

public string Title { 
     get { return Convert.ToString(ViewState["Title"]); } 
     set { ViewState["Title"] = value; } 
    } 

मैं नहीं कह सकता मैं हालांकि वास्तविक इस के साथ प्रभावित हूँ, यदि कोई उपयोगकर्ता नियंत्रण अधिक बकवास आप ViewState में चिपके हुए हो जाएगा है अधिक संपत्ति के रूप में। क्या संपत्तियों को बनाए रखने का कोई बेहतर तरीका है?

+3

सभी वेब नियंत्रण उसी तरह से करते हैं, यही कारण है कि व्यूस्टेट विशाल हो जाता है ... –

+0

मुझे अंत में इसका सहारा लेना पड़ा। यह काफी निराशाजनक है कि यह कैसे काम करता है लेकिन यह नौकरी करता है ... अभी के लिए .. :) –

उत्तर

10

यह निर्भर करता है। यदि आपको संपत्ति के मूल्यों को पोस्ट-बैक से आगे बनाए रखने की आवश्यकता है तो आपको या तो व्यूस्टेट या सत्र का उपयोग करना होगा। चूंकि उन नियंत्रणों को प्रत्येक पोस्ट पर दोबारा बनाया गया है, इसलिए आप वास्तव में उस स्थिति को अन्यथा बनाए नहीं रख सकते हैं।

+0

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

+1

"पोस्ट-बैक से आगे बने रहने के लिए आपको या तो व्यूस्टेट या सत्र का उपयोग करना होगा"। यह ViewState के लिए सच नहीं है। व्यूस्टेट केवल पोस्ट-बैक के बीच बनी रहती है, इससे परे नहीं। – dariom

-1

क्या आपने स्थिर गुणों का प्रयास किया है? यह भी याद रखें कि http स्टेटलेस है, इसलिए आप प्रत्येक शीर्षक पर अपने शीर्षक को रीसेट कर सकते हैं page_load

+2

तो जब आपके पास दो अनुरोध होते हैं तो क्या होता है और वे दोनों उपयोगकर्ता नियंत्रण पर विभिन्न गुणों का उपयोग करना चाहते हैं? –

2

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

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

5

आपकी समस्या बिल्कुल वही है जो व्यूस्टेट के लिए है: पोस्टबैक में नियंत्रण के गुणों को बनाए रखने के लिए, इसलिए आपका समाधान ठीक है।

आप इसे सत्र में सहेज सकते हैं, लेकिन यह वास्तव में केवल बोझ को सर्वर पर रखता है। आपके पास मौजूद उपयोगकर्ताओं की संख्या के आधार पर, यह वास्तव में वास्तव में बदसूरत हो सकता है।

यह भी ध्यान रखें कि यदि आप सत्र का उपयोग करते हैं तो आपको कुछ हाउसकीपिंग करना होगा। उदाहरण के लिए, यदि आप एक ही पृष्ठ पर दो बार अपने उपयोगकर्ता नियंत्रण का उपयोग करना चाहते हैं, तो आपको यह सुनिश्चित करना होगा कि प्रत्येक नियंत्रण अद्वितीय सत्र चर का उपयोग करता है।

8

उपयोगकर्ता नियंत्रण के लिए संपत्ति मूल्यों को संग्रहीत करने के लिए ViewState का उपयोग करने में कोई समस्या नहीं है।

आपका कथन "उपयोगकर्ता नियंत्रण में अधिक गुणों को अधिक बकवास है जिसे आप व्यूस्टेट में चिपके रहेंगे" हालांकि जरूरी नहीं है। नियंत्रण के लिए गुणों के व्यूस्टेट ट्रैक मानों के लिए निश्चित रूप से संभव है लेकिन __VIEWSTATE छिपे हुए फॉर्म फ़ील्ड चर में डेटा स्टोर न करें।

पागल सही लगता है? ViewState कैसे काम करता है के बारे में एक शानदार लेख के लिए TRULY Understanding ViewState देखें।

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

लिंक किए गए आलेख को देखें।यह सब कुछ की चर्चा बहुत स्पष्ट रूप से और बेहतर की तुलना में मैं :-)

0

तुम हमेशा इरादा SaveViewState/LoadViewState तरीकों ओवरराइड कर सकते हैं कर सकते हैं:

public string Title { get; set; } 

और फिर बचाने के लिए और लोड के रूप में आवश्यक:

protected override object SaveViewState() 
{ 
    // Save State as a cumulative array of objects. 
    object baseState = base.SaveViewState(); 

    object[] allStates = new object[2]; 
    allStates[1] = _title; 
    return allStates; 
} 

protected override void LoadViewState(object savedState) 
{ 
    if (savedState != null) 
    { 
     // Load State from the array of objects that was saved during SavedViewState. 
     object[] myState = (object[])savedState; 
     if (myState[0] != null) 
     base.LoadViewState(myState[0]); 

     if (myState[1] != null) 
     _title = (String)myState[1]; 
    } 
} 
संबंधित मुद्दे