2010-09-01 26 views
19

अधिक मैं ASP.NET का उपयोग करें, अधिक if (!IsPostBack) {} व्यर्थ लगता है ...कार्यान्वयन

पहले उदाहरण:

उदाहरण के लिए, मैं सिर्फ एक मुद्दा Google पर, उन्होंने कहा कि इस उपयोग समाधान का हिस्सा:

if (!Page.IsPostBack) 
{ 
    Page.LoadComplete += new EventHandler(Page_LoadComplete); 
} 

जो कोड के रूप में ठीक है, लोडकंपलेट केवल पहले लोड पर ही आग लग जाएगा। एक बटन पर क्लिक करने के बाद, या किसी भी पोस्टबैक को ट्रिगर करने वाले किसी भी चीज़ के बाद, लोडकंपलेट ईवेंट को अनचाहे छोड़ दिया जाता है, इस प्रकार ईवेंट हैंडलर को छोड़ दिया जाता है। इसलिए, उनका "फिक्स" केवल पहले लोड = बेकार पर काम करता है। मैंने तुरंत if (!Page.IsPostBack) {} पर टिप्पणी की और अब घटना हमेशा वांछित के रूप में ट्रिगर्स।

दूसरा उदाहरण:

मैं एक डायनामिक रूप से तैयार करने के लिए बटन घटनाओं हुक करने का प्रयास कर रहा हूँ (जो वैसे, मैं काम करने के लिए नहीं मिल सकता है [GRR!])। मैं उदाहरण इस दिखा देखें:

myEditToggleButton = new Button(); 
myEditToggleButton.ID = "editToggleButton"; 
//^GOTTA HAVE THIS FOR EVENTS TO WORK! (supposedly, I haven't seen it work...) 
if (!IsPostBack) 
{ 
    myEditToggleButton.Click += new EventHandler(myEditToggleButton_Click); 
} 
Controls.Add(myEditToggleButton); 
पहला उदाहरण की तरह

, मेरी समझ है कि घटना के बाद पहले पृष्ठ लोड झुका नहीं किया जाएगा इस प्रकार बटन एक क्लिक के बाद "निष्क्रिय" है (क्योंकि पर क्लिक एक शुरू हो रहा है पोस्टबैक)।

प्रश्न:

जब आप if (!IsPostBack) {} इस्तेमाल करना चाहिए? मुझे लगता है कि इसे मार्क-अप बनाए गए नियंत्रणों के साथ ही करना है।

+0

सचमुच, लोड इवेंट में कोई भी कोड एक में लपेटा नहीं गया है! पेज। आईएसपोस्टबैक कोड समीक्षाओं के दौरान मेरे लिए एक लाल झंडा है। यह अक्सर वेबफॉर्म कैसे काम करता है, इस बारे में गलतफहमी दर्शाता है, खासकर डेटा बाइंडिंग के संबंध में। –

उत्तर

15

संक्षेप में की बात है, तो आप इसे हर का उपयोग आप केवल पहले लोड पर कुछ पर अमल करने की जरूरत है ।

Page.IsPostBack का क्लासिक उपयोग डेटा बाध्यकारी/नियंत्रण प्रारंभिक है।

if(!Page.IsPostBack) 
{ 
    //Control Initialization 
    //Databinding 
} 

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

एक और क्लासिक उपयोग Querystring पैरामीटर प्राप्त और प्रसंस्करण कर रहा है। आपको पोस्टबैक पर ऐसा करने की ज़रूरत नहीं है।

+0

हां, व्यूस्टेट निश्चित रूप से – Jared

4

यह फ़ॉर्म डेटा प्रोसेसिंग के लिए है।

यदि आप पोस्ट किए गए डेटा को संभालना चाहते हैं, तो आप केवल ऐसा करना चाहते हैं यदि पृष्ठ वास्तव में डेटा पोस्ट करता है, पहले लोड पर नहीं। इसलिए, IsPostBack ध्वज।

6

जब पहली बार ऑपरेशन दोहराने की आवश्यकता नहीं है।

महंगी परिचालनों (जैसे किसी डेटाबेस से डेटा प्राप्त करना या सूचीबद्ध सूची) प्राप्त करना, जिसे केवल पृष्ठ या नियंत्रण लोड होने पर पहली बार किया जाना चाहिए। यदि पृष्ठ सर्वर पर पोस्ट किया गया है और फिर पुनः लोड किया गया है, तो ऑपरेशन को दोहराने की कोई आवश्यकता नहीं है। IsPostBack का मूल्य परीक्षण करके, आप, महंगी आपरेशन को छोड़ सकते हैं

+1

हालांकि, किसी भी गतिशील रूप से जोड़े गए नियंत्रण के साथ, वे वाष्पीकरण करते हैं। इस प्रकार, उदाहरण के लिए, यदि आपने गतिशील रूप से एक ड्रॉप-डाउन बॉक्स जोड़ा है, तो ड्रॉप-डाउन के अंदर की वस्तुओं को ड्रॉप-डाउन बॉक्स के साथ वाष्पीकरण किया जाएगा। – Yerg

+0

@Yerg, तो आपको if (! IsPostBack) – harpo

+0

@Yerg से पहले उन नियंत्रणों को जोड़ना होगा, इस पृष्ठ को गतिशील नियंत्रणों के संबंध में IsPostBack को समझने में आपकी सहायता करनी चाहिए। http://forums.asp.net/t/1186195.aspx –

3

अगर आप का कारण एक पोस्टबैक आप अपने नियंत्रण के राज्य को बदल सकते हैं अनजाने में भी है क्या हो सकता है। एक gridview का उपयोग करने में उदाहरण के लिए, यदि आप संपादन मोड दौरान postback, आप अब अपने संपादित एड क्षेत्रों के लिए उपयोग होगा।

अक्सर आप एक पृष्ठ पर disapearing जब आप सर्वर हिट से सूचना को बनाए रखने की जरूरत है, इस

if(!Page.IsPostBack) 
1

आपका ईवेंट हैंडलर्स ऊपर वायर्ड किया जाना चाहिए जब भी घटना (PostBack स्थिति पर ध्यान दिए बिना)

इसके अलावा, जब नियंत्रण गतिशील रूप से जोड़ने, page lifecycle

0

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

1
protected void Page_Load(object sender, EventArgs e)    
{ 
    if (!IsPostBack) { 
     SqlConnection conn = new SqlConnection("Data Source=-----; Database=-----; Integrated Security=True"); 
     SqlDataAdapter da = new SqlDataAdapter(); 
     conn.Open(); 
     da.SelectCommand = new SqlCommand("Select Command",conn); 
     conn.Close(); 
     DataTable dt = new DataTable(); 
     da.Fill(dt); 

     ddlSearch.DataSource = dt; 
     ddlSearch.DataTextField = "---"; 
     ddlSearch.DataValueField = "---"; 
     ddlSearch.DataBind(); 
    } 
} 
+0

का उपयोग करने के पीछे मुख्य बल है इस कोड का कुछ स्पष्टीकरण अच्छा रहा होगा –

0

सबसे पहले आप, समझने के लिए पोस्टबैक है क्या, जब आप दृश्य स्टूडियो में अपनी परियोजना शुरू करते हैं,
यदि आप एक if statement जो जांच करता है कि isPostBacktrue या false अपने Page_Load विधि में है, इस बिंदु पर है की जरूरत है isPostBackfalse है, यह एक postback नहीं है इसका मतलब है, तो क्या है पोस्टबैक,
अब क्लिक करें एक button (यदि आप एक बटन नहीं है, एक और बटन क्लिक विधि के रूप में जोड़ कृपया), इस बिंदु पर, आप एक भेज सर्वर पर वापस अनुरोध करें, सर्वर फिर प्रतिक्रिया, इस प्रक्रिया इसलिए postback, जो button क्लिक करके शुरू हो रहा है,

एक बात तुम सच में सूचना के लिए की जरूरत है कहा जाता है, Page_Load विधि फिर से निष्पादित किया जाएगा, न केवल Button_click विधि निष्पादित किया जाएगा, तो अब, isPostBacktrue है , इसका मतलब है कि यह पोस्टबैक है, हां, यह वास्तव में एक पोस्टबैक है, क्योंकि आपने बटन पर क्लिक किया है।

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