2009-09-18 18 views
6

के माध्यम से masterpage में समारोह कॉल काफी straigt आगे है, लेकिन कैसे मैं एक UserControl के लिए इसे कहते हैं:ASP.NET: एक पृष्ठ में masterpage से एक समारोह कॉलिंग UserControl

<%@ MasterType VirtualPath="~/MasterPage.master" %> जोड़ना, UserControls पर काम नहीं करता।

तो this.Page.Master.MyFunction() विफल रहता है :(

उत्तर

7

नील्स,

उत्तोलन प्रतिबिंब (के रूप में JDunkerley ने सुझाव दिया) समस्या के लिए एक दृष्टिकोण है। एक और जो आप विचार कर सकते हैं वह एक इंटरफ़ेस को कार्यान्वित कर रहा है:

  1. अपनी विधि को शामिल करने वाला एक इंटरफ़ेस बनाएं।
  2. अपने मास्टर पेज
  3. इंटरफ़ेस के माध्यम से संदर्भ this.Page.Master पर अपने नियंत्रण से इंटरफेस को कार्यान्वित करें।
  4. अपनी विधि को कॉल करें।

यह एक बेहतर ओओ दृष्टिकोण है, कम युग्मन की ओर जाता है, और निश्चित रूप से रनटाइम प्रतिबिंब से बेहतर प्रदर्शन करेगा।

मुझे आशा है कि इससे मदद मिलती है!

+0

मैंने इस दृष्टिकोण का उपयोग किया और यह ठीक काम किया! धन्यवाद –

+0

सहायता की खुशी है! हैप्पी कोडिंग :-) –

12

आप this.Page.Master कास्ट करने के लिए पहले के रूप में पृष्ठ का Master संपत्ति प्रकार System.Web.UI.MasterPage की है।

जैसे

((MyMaster)this.Page.Master).MyFunction(); 

आप उपयोगकर्ता नियंत्रण के पीछे कोड के लिए एक संपत्ति जोड़कर अंतर्निहित मास्टर पृष्ठ के प्रकार की जांच कर सकता:

public string MType 
    { 
     get { return this.Page.Master.GetType().FullName; } 
    } 

और उपयोगकर्ता नियंत्रण मार्कअप में परिणाम प्रिंट करें, उदा। यह स्रोत कोड में एक टिप्पणी के रूप में प्रिंट आउट करने के लिए इस पंक्ति जोड़ें:

<!-- <%= MType %> //--> 
+0

मुझे एक त्रुटि मिल रही है कि यह टाइप या नेमस्पेस _Master नहीं मिल सकता है ?? –

+0

आप रनटाइम पर मास्टर पेज के प्रकार की जांच करने का प्रयास कर सकते हैं। उत्तर – JDunkerley

+0

में उत्तर अपडेट करेगा प्रकार ASP.masterpage_master है लेकिन संकलन समय में उपलब्ध नहीं है। –

4

आप अपने कोड couppling कर रहे हैं बहुत thighly यदि आप अपने उपयोगकर्ता नियंत्रण के भीतर से masterpage पर एक समारोह कहते हैं।

नियंत्रण केवल उस मास्टर पर आधारित पृष्ठों पर उपयोग किया जा सकता है। मुझे लगता है कि यह आमतौर पर एक खराब डिजाइन है, और यह कम से कम डेमेटर के कानून का उल्लंघन करेगा।

आप अपने नियंत्रण में क्या करना चाहते हैं?

1

जेडंकरले के पास यह सही है। लेकिन मुझे यह समझाने की अनुमति दें कि एमवीपी का उपयोग करके इसे कैसे रद्द किया जाए ताकि आप डिजाइन समस्या से बचने के लिए काम कर सकें हेइको हैट्ज़फेल्ड बात कर रहा है।

असल में, अपने नियंत्रण और अपने मास्टर पेज दोनों के लिए एमवीपी पैटर्न लागू करें। इसे कैसे करें इसके निर्देशों के लिए here देखें। जिस मास्टर को आप मास्टर इंटरफ़ेस (IMasterView) में कॉल करना चाहते हैं उसे घोषित करें। अगला एक वर्ग बनाएं जो दो घटकों के बीच संबंधों को नियंत्रित करेगा; हम इसे पेज कंट्रोलर क्लास कहेंगे। Global.asax पर निम्न पंक्ति जोड़कर प्रत्येक अनुरोध के लिए अनुरोध स्थिति में इस वर्ग का एक उदाहरण रखें।सीएस:

/* global.asax.cs */ 
protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    // ... 
    HttpContext.Current.Items["Controller"] = new PageController(); 
    // ... 
} 

फिर आप कोड की निम्न पंक्ति के माध्यम से प्रस्तुतकर्ताओं (मास्टर और नियंत्रण) में से प्रत्येक से इस उदाहरण का उपयोग कर सकते हैं:

var controller = HttpContext.Current.Items["Controller"] as PageController; 

फिर आप एक घटना या कुछ अन्य तंत्र लागू कर सकते हैं नियंत्रण को इस साझा ऑब्जेक्ट के माध्यम से एक decoupled तरीके से मास्टर पर विधि का आह्वान करने की अनुमति दें। उदाहरण के लिए:

/* PageController.cs */ 
public event EventHandler SomeEvent; 

protected virtual void OnSomeEvent(EventArgs e) 
{ 
    Debug.Assert(null != e); 

    var handler = this.SomeEvent; 
    if (null != handler) 
     handler(this, e); 
} 

public void FireSomeEvent() 
{ 
    this.OnSomeEvent(EventArgs.Empty); 
} 

/* ControlPresenter.cs */ 
public ControlPresenter(IControlView view) 
    : base() 
{ 
    view.EventFired += (sender, e) => 
    { 
     var controller = HttpContext.Current.Items["Controller"] as PageController; 
     controller.FireSomeEvent(); 
    }; 
} 

/* MasterPresenter.cs */ 
public MasterPresenter (IMasterView view) 
    : base() 
{ 
    var controller = HttpContext.Current.Items["Controller"] as PageController; 
    controller.SomeEvent += (sender, e) => view.MyFunction(); 
} 

यकीन है कि "EventFired" घटना अपने नियंत्रण के इंटरफेस (IControlView) में घोषित कर दिया और नियंत्रण में लागू किया गया है। फिर आपको मास्टर को प्रभावित करने के लिए क्या करना है (इसकी विधि को कॉल करें), इस घटना को आग लगाना है और एमवीपी + पेजकंटोलर बाकी की देखभाल करेगा।

चीयर्स

1

मैं काम करने के लिए उपरोक्त जवाब है, तो यहां नहीं मिल सका क्या मेरे लिए काम किया है:

आप एक उपयोगकर्ता नियंत्रण से एक मास्टर पेज संपत्ति का संदर्भ लेना चाहते।

public string BodyClass 
{ 
    set 
    { 
     this.masterBody.Attributes.Add("class", value); 
    } 
} 

अब तो जैसे उपयोगकर्ता नियंत्रण ASCX फ़ाइल में मास्टर पेज के लिए एक संदर्भ जोड़ें::

<%@ Register Src="~/Source/MasterPages/Main.master" TagPrefix="MSTR" TagName="MasterPage" %> 

में फिर

सबसे पहले, आपके मास्टर पृष्ठ इसलिए की तरह एक सार्वजनिक संपत्ति होगा पीछे कोड (मेरे मामले में सी #) आपके पास यह कोड है:

Main masterPage = (Main)this.Page.Master; 
masterPage.BodyClass = "container"; 

संदर्भ के बिना आपके उपयोगकर्ता नियंत्रण के ऊपर मास्टर पेज पर मास्टर पेज क्लास नहीं मिल पाएगा।

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