2010-11-04 6 views
6

नियंत्रण से बाहर है, क्या यह पता लगाना संभव है कि पृष्ठ लाइफसाइकल (इनिट, लोड, प्रीरेंडर इत्यादि) का कौन सा चरण पता लगाना संभव है, विशेष नियंत्रण या पृष्ठ पर निर्भर है?पता लगाएं कि जीवन चक्र का कौन सा चरण एएसपी.NET वेबफॉर्म

उदाहरण के लिए, छद्म कोड में:

if myControl.CurrentLifeCycle == Lifecycle.Init 
{ do something } 

उत्तर

6

मुझे डर है कि पेज-लाइफसाइक्ल चरण में कोई पृष्ठ देखने के लिए कोई अंतर्निहित फ़ंक्शन नहीं है। पृष्ठ में सभी घटनाओं को संभाले बिना इस कार्यक्षमता को जोड़ना भी मुश्किल है, क्योंकि कुछ घटनाएं सुरक्षित हैं। इसलिए आप लाइफसाइकल लिस्टर-क्लास को कंट्रोल से भी प्राप्त कर सकते हैं, इसे पेज पर कन्स्ट्रक्टर में जोड़कर सभी घटनाओं को सुनना और ओवरराइड करना।

आप केवल सार्वजनिक "चरणों" PreInit,Init,Load,DataBinding,PreRender,Unload,Disposed दृष्टिकोण निम्नलिखित पर एक नजर है (VB.Net, लेकिन मुझे लगता है कि आप अनुमान लगा सकेंगे कि) की जरूरत है:

Public Enum LifeCyclePhase 
    AfterPreInit 
    AfterInit 
    AfterLoad 
    AfterDataBinding 
    AfterPreRender 
    AfterUnload 
    AfterDisposed 
End Enum 

Public Interface ITrackingLifeCycle 
    ReadOnly Property GetLifeCycleListener() As LifeCycleListener 
End Interface 

Public Class LifeCycleListener 

    Public Sub New(ByVal ctrl As Control) 
     Me._PageListening = ctrl.Page 
     AddListener() 
    End Sub 

    Private _CurrentPhase As LifeCyclePhase 
    Private _PageListening As Page 

    Public ReadOnly Property CurrentPhase() As LifeCyclePhase 
     Get 
      Return _CurrentPhase 
     End Get 
    End Property 

    Public ReadOnly Property PageListening() As Page 
     Get 
      Return _PageListening 
     End Get 
    End Property 

    Private Sub AddListener() 
     AddHandler _PageListening.PreInit, AddressOf PreInit 
     AddHandler _PageListening.Init, AddressOf Init 
     AddHandler _PageListening.Load, AddressOf Load 
     AddHandler _PageListening.DataBinding, AddressOf DataBinding 
     AddHandler _PageListening.PreRender, AddressOf PreRender 
     AddHandler _PageListening.Unload, AddressOf Unload 
     AddHandler _PageListening.Disposed, AddressOf Disposed 
    End Sub 

    Private Sub PreInit(ByVal sender As Object, ByVal e As EventArgs) 
     Me._CurrentPhase = LifeCyclePhase.AfterPreInit 
    End Sub 

    Private Sub Init(ByVal sender As Object, ByVal e As EventArgs) 
     Me._CurrentPhase = LifeCyclePhase.AfterInit 
    End Sub 

    Private Sub Load(ByVal sender As Object, ByVal e As EventArgs) 
     Me._CurrentPhase = LifeCyclePhase.AfterLoad 
    End Sub 

    Private Sub DataBinding(ByVal sender As Object, ByVal e As EventArgs) 
     Me._CurrentPhase = LifeCyclePhase.AfterDataBinding 
    End Sub 

    Private Sub PreRender(ByVal sender As Object, ByVal e As EventArgs) 
     Me._CurrentPhase = LifeCyclePhase.AfterPreRender 
    End Sub 

    Private Sub Unload(ByVal sender As Object, ByVal e As EventArgs) 
     Me._CurrentPhase = LifeCyclePhase.AfterUnload 
    End Sub 

    Private Sub Disposed(ByVal sender As Object, ByVal e As EventArgs) 
     Me._CurrentPhase = LifeCyclePhase.AfterDisposed 
    End Sub 
End Class 

इस वर्ग में हैंडलर कहा जाता है पृष्ठ में हैंडलर के बाद, तो यदि आप fe पेज में CurrentPhase की जांच करें। इन्हें प्रीइनिट मिलेगा। इसलिए मैंने इस चरण को AfterPreInit कहा है।

Partial Public Class _Default 
    Inherits System.Web.UI.Page 
    Implements ITrackingLifeCycle 

    Private lcl As New LifeCycleListener(Me) 

    Public ReadOnly Property GetLifeCycleListener() As LifeCycleListener Implements ITrackingLifeCycle.GetLifeCycleListener 
     Get 
      Return lcl 
     End Get 
    End Property 

अब आप हर जगह जीवन चक्र चरण की जांच कर सकते हैं, भले HttpContext.Current के माध्यम से एक नियंत्रण के लिए एक संदर्भ के बिना:

Public Class FooClass 
    Public Shared Sub Foo() 
     If Not (HttpContext.Current Is Nothing OrElse HttpContext.Current.Handler Is Nothing) Then 
      If TypeOf HttpContext.Current.CurrentHandler Is ITrackingLifeCycle Then 
       Dim page As ITrackingLifeCycle = DirectCast(HttpContext.Current.CurrentHandler, ITrackingLifeCycle) 
       Dim phase As LifeCyclePhase = page.GetLifeCycleListener.CurrentPhase 
      End If 
     End If 
    End Sub 
End Class 

यह न पर्याप्त रूप से परीक्षण किया है और न ही अपने आप के द्वारा प्रयोग किया है और निश्चित रूप improvable है, लेकिन शायद यह आपकी वर्तमान स्थिति में आपकी मदद करता है।

+0

कोड का एक अच्छा बिट - यह मेरे विशेष परिदृश्य के लिए ओवरकिल जैसा दिखता है, लेकिन मैं अभी भी प्रभावित हूं। – cbp

2

जहां तक ​​मेरा पेज जीवन चक्र को समझने के लिए, आप यह नहीं कर सकते। असल में, पृष्ठ वर्ग वह व्यक्ति है जिसे एक विशिष्ट क्रम में घटनाओं को उठाना होता है। निर्माण में कुछ भी नहीं है जो प्रसंस्करण के चरण को बताएगा। लेकिन कुछ करने के लिए, आप एक संपत्ति बना सकते हैं और इस संपत्ति को प्रसंस्करण के विभिन्न चरणों में स्थापित कर सकते हैं।

3

मुझे लगता है कि आप जो हासिल करने का प्रयास करते हैं वह अवधारणात्मक रूप से गलत है क्योंकि आप पृष्ठ की घटनाओं के बारे में पेज स्थिति के रूप में सोच रहे हैं। पृष्ठ "ऑनइनिट/ऑनलोड/..." स्थिति में नहीं हो सकता है क्योंकि यह एक घटना है।

आपको इसके लिए क्या चाहिए? शायद हम आपको अपने लक्ष्य को प्राप्त करने के लिए एक बेहतर दृष्टिकोण सुझा सकते हैं।

+0

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

+1

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

+0

फिर आप एक डेलगेट का उपयोग क्यों नहीं करते? आप एक प्रतिनिधि बना सकते हैं जो रैपर विधि को इंगित करता है और इसे ऑनलोड/ऑनइनिट/... विधि –

3

"आपके नियंत्रण के बाहर" किसी अन्य नियंत्रण या पृष्ठ के "अंदर" या जीवन चक्र की एक जुड़ी स्थिति में कुछ है। आप परीक्षण के बिना पहले से ही अपने राज्य को जानते हैं।

+0

मुझे लगता है कि मैं देख रहा हूं कि आप क्या कह रहे हैं, लेकिन यह हमेशा मामला नहीं है - निश्चित रूप से मेरे मामले में नहीं। लेकिन शायद कुछ सोचने के लिए। – cbp

2

मुझे पता चला वहाँ वास्तव में पृष्ठ वर्ग करता है बस मैं क्या देख रहा हूँ की एक आंतरिक संपत्ति है:

internal enum ControlState 
{ 
Constructed, 
FrameworkInitialized, 
ChildrenInitialized, 
Initialized, 
ViewStateLoaded, 
Loaded, 
PreRendered 
} 

मेरा मानना ​​है कि उस में आंतरिक सदस्यों तक पहुँचने के लिए संभव है: यह एक enum ControlState कहा जाता है सी # 4, here

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