2009-02-24 10 views
9

ठीक है, इसलिए हम सभी को पृष्ठ के OnPreInit ईवेंट में गतिशील रूप से एक मास्टर पेज बदलने के बारे में पता है।क्या मैं गतिशील रूप से एक नेस्टेड मास्टर पेज के मास्टर को बदल सकता हूं?

लेकिन एक नेस्टेड मास्टर पेज के बारे में क्या? क्या मैं मास्टर के मास्टर को बदल सकता हूं?

मास्टरपेज क्लास में कोई ऑनप्रिंट ईवेंट नहीं आया है।

कोई विचार?

उत्तर

9

बस इसका परीक्षण किया गया और यह पृष्ठ के प्रीइनेट से काम करता है जो नेस्टेड मास्टरपेज का उपयोग कर रहा है।

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    this.Master.MasterPageFile = "/Site2.Master"; 
} 

जाहिर है आप यह सुनिश्चित करें कि ContentPlaceholderIds पृष्ठों को आप के बीच अदला-बदली कर रहे हैं भर में लगातार कर रहे हैं की आवश्यकता होगी।

+0

हम्म हां यह एक समाधान है। दुर्भाग्यवश इसका मतलब है कि प्रत्येक पृष्ठ में कोड डालना जो एक स्थान के बजाय मास्टर पेज का उपयोग करता है। मुझे यकीन नहीं है कि दो बुराइयों में से कौन सा है ... मास्टर पेज की प्रतिलिपि बनाना, इसलिए दो प्रतियां बहुत कम काम होंगी! –

3

हम एंडी की विधि को "बेसपेज" कक्षा के साथ जोड़ते हैं - हम System.Web.UI.Page से विरासत में प्राप्त एक वर्ग बनाते हैं, और फिर हमारे सभी पृष्ठ इस कक्षा से प्राप्त होते हैं।

फिर, हमारे बेस पेज क्लास में, हम यह देखने के लिए प्रासंगिक चेक कर सकते हैं कि कौन सा रूट मास्टर पेज इस्तेमाल किया जाना चाहिए - हमारे मामले में हमारे पास "प्रेजेंटेशन" मास्टर और "ऑथरिंग" मास्टर है - प्रस्तुति संस्करण में सभी नेविगेशन और पेज फर्नीचर, भारी प्रदर्शन सीएसएस के साथ, जबकि संलेखन मास्टर के पास लेखांकन उपकरण, हल्का सीएसएस, और कोई नेविगेशन के लिए कुछ अतिरिक्त जेएस नहीं है (यह तब होता है जब उपयोगकर्ता वास्तव में पृष्ठ को संलेखित करते हैं, बजाय संशोधित करने के बजाय साइट लेआउट)।

यह बेस पेज तब पेज.मास्टर.मास्टरपेजफाइल पर कॉल कर सकता है और इसे पृष्ठ के लिए सही स्थिति होने पर इसे लेखक मास्टर पर सेट कर सकता है।

2

शायद ज़रुरत पड़े किसी को भी इस पार लड़खड़ाती है और एक साथ अपने बालों को आँसू जब एंडी कोड की कोशिश कर त्रुटि "सामग्री नियंत्रण सामग्री पृष्ठ या एक नेस्टेड मास्टर पृष्ठ एक मास्टर पेज संदर्भ में उच्च-स्तरीय नियंत्रण होना जरूरी" , this.Master से छुटकारा पाएं। तो, कोड हो जाता है:

protected void Page_PreInit(object sender, EventArgs e) 
{ 
    MasterPageFile = "/Site2.Master"; 
} 

संपादित Zhaph के रूप में नीचे बताते हैं, कोड मैं ^^ वहाँ केवल वर्तमान पृष्ठ के मास्टर, नहीं मास्टर मास्टर बदल जाएगा। यह कोड हेनेसी के बारे में बात कर रहा था जब उन्होंने "" का उल्लेख किया था, हम सभी को एक मास्टर पेज गतिशील रूप से "(जो मैंने नहीं किया था, डीओएच) बदलने के बारे में जानते हैं। यदि आप इस पृष्ठ पर "स्टैकओवरफ्लो परिवर्तन मास्टर पेज" (जो मैंने किया है) तो संभवतः वह कोड है जिसे आप ढूंढ रहे हैं :-)

+0

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

+0

अहह, गोचा।माफ करना, इस पर छड़ी का गलत अंत था। मेरे पास एक नेस्टेड मास्टर की बजाय एक मास्टर के साथ स्टॉक मानक पृष्ठ था। वह मुझे पहले पढ़ने और सोचने के लिए सिखाएगा :-) –

+0

कोई चिंता नहीं, आपके संपादन के लिए +1 :) –

0

के उत्तर में जोड़ने के लिए झफ - बेन डुगुइड, (वैसे +1):

यहां उदाहरण कोड है जो नेस्टेड मास्टर पेज का मास्टर पेज सेट करता है। सभी पेज इस बेसपेज से प्राप्त होते हैं, इसलिए यह कोड केवल एक ही स्थान पर मौजूद है।

public class BasePage : System.Web.UI.Page 
{ 
    private void Page_PreInit(object sender, System.EventArgs e) 
    { 
     if (Request.Browser.IsMobileDevice) 
     { 
      if (Page.MasterPageFile == "~/master/nested.master")) 
      { 
       Page.Master.MasterPageFile = "~/master/mobile.master"; 
      } 
      else 
      { 
       MasterPageFile = "~/master/mobile.master"; 
      } 
     } 
    } 
} 
संबंधित मुद्दे