2011-02-09 14 views
5

वेबफॉर्म के साथ काम करने के बावजूद मैं अभी भी समय-समय पर घटना जीवन चक्र के बारे में भ्रमित हो रहा हूं। यह ऐसी समस्या नहीं है जिसे हल करने की आवश्यकता है, क्योंकि यह समझने की उम्मीद है कि चीजें किस तरह से काम करती हैं।उप-नियंत्रक अपने कंटेनर से पहले क्यों प्रारंभ करते हैं?

मान लीजिए आप एक रूप है:

Default.aspx:

<form> 
    <MyControls:UserControl1 runat="server"> 
</form> 

UserControl1: ascx:

<MyControls:UserControl2 runat="server"> 

OnInit घटनाओं इस क्रम में होते हैं:

UserControl2_OnInit 
UserControl1_OnInit 
Default_OnInit 

क्या यह सिर्फ बास-अक्वार्ड नहीं है? इनिट कोड को क्रम में चलाने के क्रम में नहीं चलाना चाहिए? क्या माता-पिता नियंत्रण अपने ऑनइनिट रन से पहले किसी बच्चे के गुणों को प्रारंभ करने में सक्षम नहीं होना चाहिए? यही है, जबकि आप मार्कअप में सबकंट्स के गुणों को प्रारंभ कर सकते हैं, लेकिन माता-पिता नियंत्रण को गतिशील रूप से बाल नियंत्रण के गुण सेट करने में सक्षम होने का कोई सीधा तरीका नहीं है जो इसके ऑनइनिट ईवेंट में उपलब्ध होगा।

क्या मैं कर रहा समाप्त हो गया गया है इस तरह की चीज़ है:

override void UserControl2_OnInit() 
{ 
    NamingContainer.OnInit += new EvenHandler(UserControl1_ActualInit); 
} 
protected void UserControl2_ActualInit(..) { 
    // do actual init code here, which will occur before OnLoad but after it's parent 
    // OnInit 
} 

तो यह एक दुर्गम समस्या नहीं है। मुझे समझ में नहीं आता कि यह पहली जगह क्यों है।

मुझे एहसास है कि शायद आप अपने ऑनइनिट कोड में अपने सभी बाल नियंत्रण आरंभ करने में सक्षम होना चाहेंगे। तो ठीक है, आपको आधार पर कॉल करने में सक्षम होना चाहिए। पहले इंटिनेट, इसके बाद, अपना खुद का प्रारंभिक कोड, जिसके कारण सभी बच्चे को ऑनइनिट प्रोग्राम्स को चलाने के लिए नियंत्रण करना चाहिए। लेकिन घटना जीवन चक्र कि जिस तरह से काम नहीं करता। Init घटनाओं रिकर्सिवली श्रृंखलित कर रहे हैं नहीं, वे स्वतंत्र रूप से माता-पिता की घटनाओं को चलाने के लिए लगता है, और अंतरतम एक हमेशा पहले चलाने हो जाता है। लेकिन ऐसा लगता है कि यदि जीवन किसी भी स्थिति में आपकी बात करने से पहले आप बेस इवेंट (या नहीं) को कॉल कर सकते हैं तो जीवन बहुत आसान होगा। क्या कोई ऐसी चीज है जो मुझे याद आ रही है जो इस प्रत्याशित स्थिति को वांछनीय या यहां तक ​​कि आवश्यक बनाता है?

+0

मैं आपके साथ सहमत हूं क्योंकि आधार कक्षाएं उनके बच्चों के सामने शुरू होती हैं। –

+2

मेरे पास आपके प्रश्न का उत्तर नहीं है, लेकिन मैं आपको बता सकता हूं कि दिशानिर्देश यह है कि आपको जीवन चक्र में इस चरण में माता-पिता या बच्चे के कंटेनरों पर भरोसा नहीं करना चाहिए। http://msdn.microsoft.com/en-us/library/system.web.ui.control.init.aspx –

+0

यह मुझे लगता है कि वेबफॉर्म आर्किटेक्चर में एक मौलिक डिज़ाइन दोष है। इसलिए आपको माता-पिता और बाल नियंत्रणों के बीच संबंध स्थापित नहीं करना चाहिए (मुझे लगता है) 'ऑनलोड'। हालांकि, 'ऑनलोड' से पहले चीजों को करना अक्सर महत्वपूर्ण होता है, जैसे गतिशील रूप से बनाए गए नियंत्रणों को पुनर्निर्मित करना (जो ओएनआईआईटी में क्या करना है: http://support.microsoft.com/kb/317794 तो अगर आपको जानकारी चाहिए डाटाबेस से यह पता लगाने के लिए कि कौन से नियंत्रण बनाए गए हैं? तो क्या होगा यदि आपका डेटा स्रोत माता-पिता द्वारा निर्धारित किया जाता है? –

उत्तर

2

This document अपने जीवन चक्र प्रश्नों के लिए सच्चाई का मुख्य स्रोत होना चाहिए।

मूल रूप से, ऑनइनिट को में नियंत्रण के आंतरिक प्रारंभ के बाद आग लगती है। चूंकि पेज नियंत्रण पहले नियंत्रण प्रारंभ, और यह आंतरिक आरंभीकरण यह सभी उप-नियंत्रण initializes (शायद क्रम कि Designer.cs फ़ाइल देता में) है के दौरान होता है, तो यह कहा जाता है कि पिछले एक होने के लिए पृष्ठ के OnInit घटना के लिए समझ में आता है , क्योंकि यह तब तक शुरू नहीं हुआ जब तक कि इसके सभी उप-नियंत्रण प्रारंभ नहीं हो जाते हैं और उनकी ऑनइनिट घटनाओं को निकाल दिया जाता है।रेखांकन, यह इस तरह दिखता है:

Page internal init 
    Sub-control1 internal init 
     Sub-sub-control3 internal init 
     Sub-sub-control3 init finished/OnInit fired 
    Sub-control1 init finished/OnInit fired 
    Sub-control2 internal init 
    Sub-control2 init finished/OnInit fired 
Page init finished/OnInit fired 

तो इस मामले में inits के आदेश है:

  1. उप-उप control3 OnInit
  2. उप-Control1 OnInit
  3. उप-Control2 OnInit
  4. पेज ऑनइनिट

लोड भी इसी तरह काम करता है। आम तौर पर आपको अधिकांश घटनाओं का इलाज करना चाहिए, हालांकि नियंत्रण पहले इसकी आंतरिक प्रक्रिया के माध्यम से जाएगा (जिसमें सभी उप-नियंत्रणों पर एक ही घटना को कॉल करना शामिल है), और फिर बाद में अपने कस्टम इवेंट हैंडलिंग कोड को आग लगाना चाहिए।

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

1

asp.net माता पिता & बच्चे नियंत्रण के लिए मानसिकता है:

माता पिता अपने बच्चों को सब के बारे में पता है, लेकिन बच्चों अपने माता पिता के बारे में कुछ नहीं पता है।

यह मानसिकता पुनः उपयोग करने योग्य सर्वर नियंत्रणों के लिए समझ में आता है। पुन: प्रयोज्यता को कस्टम बाल नियंत्रण की आवश्यकता होती है जिस पर इसका उपयोग किए जाने वाले पृष्ठ के बारे में कोई धारणा नहीं होती है।

आपके द्वारा दिया गया स्निपेट मुझे अनुमान लगाता है कि आपके बच्चे के उपयोगकर्ता नियंत्रण का उद्देश्य पुन: उपयोग करने योग्य नहीं है; बल्कि एक विशेष & मुश्किल यूआई की जटिलताओं को तोड़ने के लिए आप विशेष नियंत्रण हैं?

इस मामले में मैं अभी भी 'बच्चों को अपने माता-पिता के बारे में कुछ भी नहीं जानता' मानसिकता के साथ काम करने का प्रयास करता हूं। http://www.google.co.uk/search?q=gof+mediator+pattern पर विचार करें जहां मूल पृष्ठ आपके बच्चों के बीच मध्यस्थ है (विकिपीडिया पृष्ठ अच्छा है)।

लेकिन आपके बच्चों को अभी भी माता-पिता के अधिकार के बारे में कुछ पता होना चाहिए, क्योंकि वे जटिल UI इंटरैक्शन कर रहे हैं? आप इसे इंटरफेस के साथ संबोधित कर सकते हैं। प्रत्येक बच्चा माता-पिता पर निर्भर नहीं करता है, लेकिन एक इंटरफ़ेस पर जो परिभाषित करता है कि बच्चों को वास्तव में क्या पहुंच की आवश्यकता है। http://en.wikipedia.org/wiki/SOLID के रूप में यह कहते हैं, 'विवेकाधिकार पर नहीं, अवशेषों पर निर्भर करता है'। प्रति बच्चे नियंत्रण में एक इंटरफ़ेस करें: 'कई क्लाइंट विशिष्ट इंटरफ़ेस एक सामान्य उद्देश्य इंटरफ़ेस से बेहतर होते हैं'

लेकिन यह सब खत्म हो गया है, क्या यह नहीं है? यह पता चला है कि एक घटक यूआई जहां घटकों को बातचीत करनी चाहिए, केवल जटिल है, और घटक बड़े एन क्लंकी को बदल सकते हैं। यह था, imho, एमएस वेब के कारणों में से एक AJAX नियंत्रण jQuery & सी खोने के लिए बनाता है। एमवीसी के साथ भी आया था।

इसमें जोड़ें कि वेब फॉर्म यूई यूनिट परीक्षण के लिए बहुत कठिन है; और आपके सॉफ्टवेयर गुणवत्ता डाइव्स में आपका विश्वास।

मैं अनुशंसा करता हूं: यदि आप कर सकते हैं, तो एमवीसी में एक पुनर्लेखन से बचें। यदि आप नहीं कर सकते हैं, तो सर्वर-साइड नियंत्रण को त्यागने पर विचार करें जो क्लाइंटसाइड व्यवहार करते हैं, और इसके बजाय jQuery का उपयोग करते हैं। यदि आप ऐसा नहीं कर सकते हैं, तो यूआई को सरल बनाने के लिए सरल बनाना आसान बनाएं। यहां तक ​​कि अगर यह कम कार्यात्मक बनाता है। यदि आप इसे नहीं चाहते हैं, तो आपके विकल्प हैं: यूआई को इंजीनियरिंग के खर्च का भुगतान करें; या इंजीनियरिंग को अच्छी तरह से खर्च करने की कीमत का भुगतान करें।

+0

सच में, मैं जो कुछ कहता हूं वह करता हूं: वेबफॉर्म से बचें। यह अभी भी विरासत कोड में दुर्भाग्य से आता है - यहां तक ​​कि मेरे क्यू एक साल से भी अधिक पुराना है। लेकिन मेरे प्रश्न के विनिर्देशों में बच्चे को अपने माता-पिता के बारे में कोई जानकारी नहीं है। मैं जानना चाहता था कि एक बच्चा * उसके माता-पिता के सामने क्यों शुरू होता है। माता-पिता, पूर्ण बच्चों का ज्ञान है, वेबफॉर्म में बनाए जाने से पहले मूल रूप से निर्भरताओं को इंजेक्ट करने का कोई मौका नहीं है। मैंने जो निर्माण बनाया है, उसमें बच्चे को अपने माता-पिता का जिक्र करना शामिल है, लेकिन केवल एक तंत्र के रूप में अपने माता-पिता को एक कन्स्ट्रक्टर तक पहुंचने देना है। –

+0

यहां वही वेबफॉर्म होगा वर्षों से हमारे साथ रहो। इस क्यू में मैं किस तरह ठोकर खा रहा हूं, मैं मदद के लिए नियंत्रण जीवन चक्र विषयों के आसपास खोज कर रहा था कि मैं कितनी दूर एक इकाई परीक्षण में एक पृष्ठ को तत्काल और परीक्षण कर सकता हूं। मैं बाल नियंत्रण पर फंस गया। लेकिन - बच्चे के कन्स्ट्रक्टर में कुछ इंजेक्ट करने की इच्छा नहीं है बच्चे को अपने पर्यावरण के बारे में कुछ जानने की जरूरत है? –

+0

शायद मैं "पर्यावरण" के बारे में आपके बिंदु को गलत समझ रहा हूं, मेरा मतलब है, 'योग (ए, बी)' एक ऐसी कक्षा है जिसे दो चीजों को जानने की जरूरत है जो इसे एक साथ जोड़ने जा रहे हैं। लेकिन यह निर्माण पर जानकारी प्रदान की जाती है; यह इसके बाहर कुछ से नहीं पूछता है। आप अपने मार्कअप में पारित संकलन-समय गुणों के रूप में, उपयोगकर्ता नियंत्रण के साथ भी ऐसा नहीं कर सकते हैं। तो यदि आप मूल रूप से "उपयोगकर्ता नियंत्रण किसी उपयोगकर्ता द्वारा किसी भी तरह से कॉन्फ़िगर करने योग्य नहीं माना जाता है" तो हाँ ... यह वही तरीका है ... लेकिन यह एक ठोस सिद्धांत नहीं है। यह सिर्फ उन्हें कम उपयोगी बनाता है। –

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