2010-07-04 9 views
54

पोस्टबैक पर में कारण पोस्टबैक पर नियंत्रण की जांच कर सकते हैं, मैं कैसे जांच कर सकते हैं जो Page_Init घटना में कारण पोस्टबैक नियंत्रित करते हैं।पोस्टबैक पर, कैसे मैं जो Page_Init घटना

protected void Page_Init(object sender, EventArgs e) 
{ 
//need to check here which control cause postback? 

} 

धन्यवाद

उत्तर

104

मुझे लगता है कि पोस्ट बैक कंट्रोल पाने के लिए पहले से ही कुछ बेहतरीन सलाह और विधियां सुझाती हैं। हालांकि मुझे पोस्ट बैक कंट्रोल आईडी पुनर्प्राप्त करने के लिए एक और वेब पेज (Mahesh blog) मिला।

मैं इसे यहाँ एक छोटे संशोधन के साथ पोस्ट करेंगे, यह एक विस्तार वर्ग की जाए। उम्मीद है कि यह इस तरह से अधिक उपयोगी है।

/// <summary> 
/// Gets the ID of the post back control. 
/// 
/// See: http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx 
/// </summary> 
/// <param name = "page">The page.</param> 
/// <returns></returns> 
public static string GetPostBackControlId(this Page page) 
{ 
    if (!page.IsPostBack) 
     return string.Empty; 

    Control control = null; 
    // first we will check the "__EVENTTARGET" because if post back made by the controls 
    // which used "_doPostBack" function also available in Request.Form collection. 
    string controlName = page.Request.Params["__EVENTTARGET"]; 
    if (!String.IsNullOrEmpty(controlName)) 
    { 
     control = page.FindControl(controlName); 
    } 
    else 
    { 
     // if __EVENTTARGET is null, the control is a button type and we need to 
     // iterate over the form collection to find it 

     // ReSharper disable TooWideLocalVariableScope 
     string controlId; 
     Control foundControl; 
     // ReSharper restore TooWideLocalVariableScope 

     foreach (string ctl in page.Request.Form) 
     { 
      // handle ImageButton they having an additional "quasi-property" 
      // in their Id which identifies mouse x and y coordinates 
      if (ctl.EndsWith(".x") || ctl.EndsWith(".y")) 
      { 
       controlId = ctl.Substring(0, ctl.Length - 2); 
       foundControl = page.FindControl(controlId); 
      } 
      else 
      { 
       foundControl = page.FindControl(ctl); 
      } 

      if (!(foundControl is IButtonControl)) continue; 

      control = foundControl; 
      break; 
     } 
    } 

    return control == null ? String.Empty : control.ID; 
} 

अद्यतन (2016/07/22): Button और ImageButton के लिए प्रकार की जांच IButtonControl देखने के लिए तीसरे पक्ष के नियंत्रण से Postbacks मान्यता प्राप्त करने की अनुमति बदल दिया है।

+3

इसके लिए धन्यवाद ... पुन: उपयोग के लिए बिल्कुल सही स्निपेट। – trgraglia

+1

मेरे पास एक उन्नत परिदृश्य है जहां यह काम नहीं कर रहा है - http://stackoverflow.com/questions/14486733/how-to-check-whether-postback-caused-by-a- गतिशील- लिंक- बटन – Lijo

+4

क्या यह नहीं है अगर एक से अधिक बटन या छवि बटन हैं तो असफल हो जाएं? ऐसा लगता है कि यह केवल पहले को वापस लौटाएगा। –

9

या तो प्रपत्र मापदंडों में प्रत्यक्ष या

string controlName = this.Request.Params.Get("__EVENTTARGET"); 

संपादित:

// input Image with name="imageName" 
if (this.Request["imageName"+".x"] != null) ...;//caused postBack 

// Other input with name="name" 
if (this.Request["name"] != null) ...;//caused postBack 

आप कर सकते थे: यदि कोई नियंत्रण एक पोस्टबैक (स्वयं) की वजह से जाँच करने के लिए सभी नियंत्रणों के माध्यम से भी पुनरावृत्त करें और जांचें कि इनमें से कोई एक है या नहीं एम ने उपरोक्त कोड का उपयोग करके पोस्टबैक का कारण बना दिया।

+1

मैं जाँच की है, इसके मेरे लिए काम नहीं कर रहा –

+0

वैसे तो, आपको उन सभी नियंत्रणों को जानना होगा जो पोस्टबैक के कारण हो सकते हैं और जांच सकते हैं कि पैरामीटर संग्रह में कोई मान है ('अनुरोध [controlName]')। –

+0

@ जारोस्लाव जांडेक इस उत्तर के लिए धन्यवाद।मेरे पास एक उदाहरण था जहां मुझे पृष्ठ ऑनलोड ईवेंट के दौरान एक बटन क्लिक करने की आवश्यकता थी, लेकिन अनुरोध ["__ EVENTTARGET"] किसी कारण से खाली था (भले ही यह अन्य नियंत्रणों के साथ पोस्टबैक का कारण न हो। अनुरोध के खिलाफ एक जांच [myButton। UniqueID] पूरी तरह से काम किया। +1 :) –

3

यह मान लिया जाये कि एक सर्वर नियंत्रण है, तो आप उपयोग कर सकते हैं Request["ButtonName"]

देखने के लिए कि एक विशिष्ट बटन क्लिक किया गया था: if (Request["ButtonName"] != null)

+3

अनुरोध [नाम] सभी async पोस्ट बैक –

14

यहाँ कुछ कोड है कि आप के लिए चाल कर सकते हैं (Ryan Farley's blog से लिया गया) है

public static Control GetPostBackControl(Page page) 
{ 
    Control control = null; 

    string ctrlname = page.Request.Params.Get("__EVENTTARGET"); 
    if (ctrlname != null && ctrlname != string.Empty) 
    { 
     control = page.FindControl(ctrlname); 
    } 
    else 
    { 
     foreach (string ctl in page.Request.Form) 
     { 
      Control c = page.FindControl(ctl); 
      if (c is System.Web.UI.WebControls.Button) 
      { 
       control = c; 
       break; 
      } 
     } 
    } 
    return control; 
} 
+0

के लिए शून्य है मैं इस कोड को स्वीकार करता हूं, मैंने इसे थोड़ी देर के लिए उपयोग किया है। – Alex

+0

यह सही कोड है, मेरा उत्तर पेजउटीलिटी क्लास को संदर्भित करता है, जिसे मैं पूरी तरह भूल गया हूं, यह उपरोक्त विधि के साथ बनाई गई कक्षा है। – Alex

8

आप जो नियंत्रण पोस्टबैक वजह से जांच करने की जरूरत है, तो आप बस सीधे ["__EVENTTARGET"] तुलना कर सकते हैं नियंत्रित करने के लिए आप में रुचि रखते हैं:

if (specialControl.UniqueID == Page.Request.Params["__EVENTTARGET"]) 
{ 
    /*do special stuff*/ 
} 

इसका मतलब यह है कि आप बस से परिणाम की तुलना करने जा रहे हैं वैसे भी GetPostBackControl(...) विस्तार विधि। यह हर स्थिति को संभाल नहीं सकता है, लेकिन अगर यह काम करता है तो यह आसान है। इसके अलावा, आप पृष्ठ को उस नियंत्रण की तलाश नहीं करेंगे जिसकी आपको परवाह नहीं है।

+0

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

3
if (Request.Params["__EVENTTARGET"] != null) 
{ 
    if (Request.Params["__EVENTTARGET"].ToString().Contains("myControlID")) 
    { 
    DoWhateverYouWant(); 
    } 
} 
1

पिछले जवाब में नया, Request.Params["__EVENTTARGET"] उपयोग करने के लिए आप विकल्प सेट करने के लिए है:

buttonName.UseSubmitBehavior = false; 
1

नियंत्रण का सही नाम पाने के लिए, उपयोग करें:

string controlName = Page.FindControl(Page.Request.Params["__EVENTTARGET"]).ID; 
+1

यह कोड काम नहीं करता है .... –

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