2012-06-23 26 views
9

मैं इस धारणा के तहत हूं कि एक नेस्टेड अपडेटपैनल में एक नियंत्रण शीर्ष स्तर अपडेटपैनल को रीफ्रेश करने का कारण बनता है (इस प्रकार अपडेटपेनल दोनों को रीफ्रेश करना) क्योंकि उस नियंत्रण पर कोई भी ईवेंट "निहित" ट्रिगर के रूप में कार्य करता है। क्या वो सही है?नेस्टेड अपडेट पैनेल माता-पिता को पोस्टबैक का कारण बनता है?

मैं इस तरह के तार कुछ करने की कोशिश कर रहा है अप-

UserControl 

    Parent UpdatePanel 

    "Show" button 

     ASP:Panel 

     Dynamically added UserControls, each with UpdatePanels 

जब दिखाएँ बटन क्लिक किया जाता है, एएसपी: पैनल दिखाई देने लगता है और कुछ पीछे के अंत के आधार पर डायनामिक ही UserControls जोड़ने, शुरू होता है तर्क।

प्रत्येक गतिशील रूप से जोड़े गए नियंत्रण (अब से: UserControls) में अपने स्वयं के एटलस-सक्षम बटन और लिंक हैं, इसलिए उनके पास अपडेटपेनल भी हैं। वर्तमान में जब मैं UserControls में से किसी एक लिंक पर क्लिक करता हूं, तो एएसपी की संपूर्ण सामग्री: पैनल गायब हो जाता है, जैसे कि इसे फिर से प्रस्तुत किया जा रहा है। मेरे सभी गतिशील रूप से जोड़े गए नियंत्रण गायब हो जाते हैं, और डीबगर में उनकी कोई भी क्लिक ईवेंट नहीं पकड़ी जाती है।

मुझे लगता है कि यहां क्या हो रहा है यह है कि नेस्टेड अपडेट पैनलों में रहने वाले नियंत्रण माता-पिता अपडेटपैनल को वापस पोस्ट करने का कारण बन रहे हैं क्योंकि वे "निहित" ट्रिगर्स को फायर कर रहे हैं। क्या मेरे UserControls को स्वायत्तता से संचालित करने और एएसपी के साथ गड़बड़ करने का कोई तरीका नहीं है: पैनल जिसमें उन्हें शामिल है?

यदि नहीं, तो मुझे यहां किस रणनीति का पीछा करना चाहिए? अगर मुझे पूरे एएसपी को फिर से प्रस्तुत करना होगा: पैनल हर बार एक घटना (संभवतः कई) UserControls पर होता है, इसका मतलब है कि मुझे UserControls को फिर से बनाना होगा, जो बनाने के लिए थोड़ा सा प्रयास करें। मुझे उन्हें फिर से बनाने के लिए किसी प्रकार का दृश्य राज्य भी संरक्षित करना होगा। मैं एएसपी.नेट के लिए कुछ नया हूं और यह डरावना लगता है। मैं शीर्ष लीव UserControl और ASP को कभी भी रीफ्रेश नहीं करना चाहूंगा: पैनल यदि मैं इससे बच सकता हूं, और प्रत्येक गतिशील रूप से जोड़े गए उपयोगकर्ता नियंत्रणों को आग लगाना चाहिए और अपनी घटनाओं को असीमित रूप से संभाल लें।

संपादित करें: गतिशील रूप से नियंत्रण जोड़ने के बजाय, मैंने उन्हें मार्कअप (खराब समाधान नहीं) में जोड़ा। तो नियंत्रण गायब होने वाली समस्याओं से छुटकारा पा लिया, क्योंकि अब नियंत्रण गतिशील रूप से जोड़े नहीं गए हैं बल्कि मार्कअप में मौजूद हैं। लेकिन फिर भी माता-पिता अपडेटपेनल पोस्टिंग एक बड़ी प्रदर्शन हिट है, क्योंकि सभी उपयोगकर्ता नियंत्रण एक के बजाय पोस्ट हो रहे हैं। मैं केवल एक उपयोगकर्ता नियंत्रण पोस्टबैक कैसे बना सकता हूं? साथ ही, मैं जानना चाहता हूं कि गतिशील रूप से जोड़े गए नियंत्रणों की समस्या से कैसे छुटकारा पाना है?

उत्तर

14

सबसे पहले, ध्यान रखें: अपडेटपैनल्स किसी पृष्ठ के जीवन चक्र को बदलें।

नियंत्रण ट्री (UpdatePanels सहित) के सभी सिर्फ एक सामान्य पोस्टबैक जीवन चक्र के साथ के रूप में फिर से बनाया जाना चाहिए। अद्यतनपैनल्स सुनिश्चित करते हैं कि प्रस्तुत किए गए (HTML) दृश्य के केवल भाग वापस लौटा दिया गया है। सभी अपडेटपेनल्स को हटाकर परिणाम उसी व्यवहार में पूर्ण पोस्टबैक के साथ होना चाहिए। उदाहरण के लिए, केवल एक नेस्टेड अपडेटपेनल का प्रतिनिधित्व करने वाला HTML (संभवतः डेटा बदल गया है) XHR प्रतिक्रिया में वापस भेजा जा सकता है।

"सत्य" प्राप्त करने के लिए AJAX पृष्ठ विधियों पर विचार करें। वैकल्पिक रूप से, डेवएक्सप्रेस (और शायद टेलीरिक और अन्य?) अपने स्वयं के "कॉलबैक पैनल" की पेशकश करते हैं, जो अपडेटपेनल के समान हैं, लेकिन जीवन चक्र के हिस्सों को बाईपास कर सकते हैं (और परिणामस्वरूप, अक्सर व्यूस्टेट मॉडल का समर्थन नहीं करते हैं या अपने स्वयं के quirks परिचय कर सकते हैं)।


जबकि ऊपर समझ नहीं नियंत्रण "गायब" का सर्वाधिक संभावित कारण है, यहाँ मेरी नियम है: [नेस्टेड] UpdatePanels काम "स्वचालित रूप से" चलो न करें।

गतिशील नियंत्रण और नेस्टेड अपडेटपैनल्स के साथ एज केस का सामना करना होगा। इसे संभालने का एक अच्छा तरीका हो सकता है, लेकिन मैं कई अलग-अलग प्रयासों में विफल रहा हूं।

इसके बजाय, के लिए हर अद्यतन पैनल, साथ चलाएँ:

UpdateMode="Conditional" 
ChildrenAsTriggers="False" 
"सशर्त" UpdateMode साथ

, मैन्युअल रूप से उत्प्रेरक नियंत्रण तैयार करें या panel.Update() फोन (हालांकि यह कड़ी मेहनत से तार नियंत्रण) यह सुनिश्चित कर लें जैसी ज़रूरत। ChildrenAsTriggers="True" की जरूरतों के आधार पर भी काम कर सकता है। बड़ी बात यह है कि UpdateMode "हमेशा" डिफ़ॉल्ट नहीं है।

इस दृष्टिकोण पर स्विच करने के बाद, मुझे कोई समस्या नहीं है - ठीक है, लगभग कोई भी - नेस्टेड अपडेटपैनल्स के साथ।

हैप्पी कोडिंग!


पेज को सही ढंग से प्रस्तुत नहीं होती है जहां आंशिक प्रतिपादन (ScriptManager में) अक्षम है (उदाहरण के लिए सभी अनुरोधों को पूरा Postbacks कर रहे हैं) तो उम्मीद करना/मानना ​​है कि यह सही ढंग से साथ काम करेंगे कोई कारण नहीं है UpdatePanels।

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

0

मुझे भारी AJAX Gridview नियंत्रण के साथ एक समान समस्या थी, और एक HTML पृष्ठ एकाधिक UpdatePanels, कुछ नेस्टेड, कुछ नहीं।

यह मुझे सभी पोस्ट बैक और आंशिक पोस्टबैक को हल करने के लिए परीक्षण और त्रुटि, पढ़ने, परीक्षण, डिबगिंग और प्रोटोटाइप के 3 सप्ताह से अधिक समय ले गया।

हालांकि मैंने एक पैटर्न देखा, जो मेरे लिए काम करता था।

उपरोक्त प्रतिक्रिया के @user की तरह, सुनिश्चित करें कि आपके अपडेटपेनल्स को अंतिम या निर्णायक नियंत्रण पर सशर्त और केवल विशिष्ट asp:PostBackTrigger सेट किया गया है, जिसे आप पृष्ठ को पूर्ण पोस्टबैक करना चाहते हैं। मैं हमेशा asp:AsyncPostBackTrigger का उपयोग करता हूं जहां कहीं भी संभव हो।

तो उदाहरण के लिए, यदि आप ग्रिड व्यू के अंदर अपडेटपैनल्स का उपयोग कर रहे हैं और आप ग्रिडव्यू की पंक्ति के सेल के अंदर एक पॉपअप चाहते हैं, तो आपको एक नेस्टेड अपडेट पैनेल का उपयोग करने की आवश्यकता है।

यानी

<asp:TemplateField HeaderText="Actions &amp; Communications"> 
    <ItemTemplate> 
     <asp:UpdatePanel ID="upAction1" runat="server" UpdateMode="Conditional"> 
      <Triggers> 
       <asp:AsyncPostBackTrigger ControlID="btnActionOK" /> 
      </Triggers> 
      <ContentTemplate> 
... 
... 
          <ajaxToolkit:ModalPopupExtender ID="ajaxMPE" runat="server" 
           BackgroundCssClass="modalBackground" 
           PopupControlID="upAction2" 
           TargetControlID="btnADDaction"> 
          </ajaxToolkit:ModalPopupExtender> 
          <asp:UpdatePanel ID="upAction2" runat="server" UpdateMode="Conditional"> 
           <ContentTemplate> 
            <asp:Panel ID="pnlACTION" runat="server" CssClass="pnlACTION"> 
             <div id="divHDR"> 
              <asp:Label ID="lblActionHdr" runat="server">** header **</asp:Label> 
             </div> 
             <div id="divBOD"> 
              <table style="width: 98%; text-align:left"> 
               <tr> 
                <td colspan="2"> 
                Please enter action item:<br /> 
                 <asp:TextBox ID="txtAction" runat="server" ValidationGroup="vgAction" TextMode="MultiLine" Rows="3" Width="98%"></asp:TextBox> 
                 <asp:RequiredFieldValidator ID="rfvAction" runat="server" ControlToValidate="txtAction" ValidationGroup="vgAction" 
                  ErrorMessage="* Required" SetFocusOnError="True"></asp:RequiredFieldValidator></td> 
               </tr> 
               <tr> 
                <td colspan="2"> 
                Select staff assigned to this task:<br /> 
                 <asp:DropDownList ID="ddlActionStaff" runat="server" AppendDataBoundItems="true" ValidationGroup="vgAction" /> 
                 <asp:RequiredFieldValidator ID="rfvStaff" runat="server" ControlToValidate="ddlActionStaff" InitialValue="0" ValidationGroup="vgAction" 
                  ErrorMessage="* Required" SetFocusOnError="True" Width="98%"></asp:RequiredFieldValidator></td> 
               </tr> 
               <tr> 
                <td colspan="2" style="text-align: center"> 
                  <asp:Button ID="btnActionOK" runat="server" Text="OK" OnClick="btnActionOK_Click" ValidationGroup="vgAction" CausesValidation="false" /> 
                  <asp:Button ID="btnActionCANCEL" runat="server" Text="CANCEL" OnClick="btnActionCANCEL_Click" ValidationGroup="vgAction" CausesValidation="false" /> 
                </td> 
               </tr> 
              </table> 
             </div> 
            </asp:Panel> 
           </ContentTemplate> 
          </asp:UpdatePanel> 
         </td> 
        </tr> 
       </table> 
       <asp:SqlDataSource ID="sdsTETactions" runat="server" ConnectionString="<%$ ConnectionStrings:ATCNTV1ConnectionString %>" 
... 
... 
       </asp:SqlDataSource> 
      </ContentTemplate> 
     </asp:UpdatePanel> 
    </ItemTemplate> 
    <ItemStyle HorizontalAlign="Center" /> 
</asp:TemplateField> 

सूचना कुछ यहाँ बातें:

  • ModalPopupExtender ठीक है का उल्लेख नहीं करता और बटन रद्द करें।ऐसा इसलिए है क्योंकि मैं चाहता हूं कि वे सर्वर पर आंशिक पोस्टबैक ट्रिगर करें (कोड-पीछे)
  • नेस्टेड अपडेटपैनल (अपएक्शन 2) पूरी तरह से उस पैनल पर आंशिक पोस्टबैक को मजबूर करने के लिए है (pnlAction)! इसलिए यह डेटा सत्यापन ट्रिगर को काम करने के लिए मजबूर करता है और यदि उपयोगकर्ता आवश्यक फ़ील्ड सत्यापनकर्ताओं में डेटा प्रदान नहीं करता है तो
  • मुख्य अपडेट पैनेल (अपएक्शन 1) पूरे लॉट को नियंत्रित करता है और केवल उस पैनल के भीतर रखे सभी पोस्टबैक रखता है और प्रभावित नहीं करता है ग्रिडव्यू (पूरी तरह से नहीं दिखाया गया)।

एक महान लेख here है, जो इसे बेहतर समझाता है।

मुझे उम्मीद है कि यह किसी को

की सहायता करता है

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

  • कोई संबंधित समस्या नहीं^_^