2009-04-17 9 views
9

परिदृश्य

मैं asp.net मास्टर पेज जिसमें मैं ऊपर और एक पृष्ठ के तल पर कुछ सामग्री को दोहराना चाहते हैं का उपयोग कर एक आवेदन दिया है। वर्तमान में मैं कुछ इस तरह का उपयोग करें:ContentPlaceHolders: दोहराया सामग्री

मास्टर पृष्ठ
<html> 
    <body> 
    <asp:ContentPlaceHolder ID="Foo" runat="server"> 
    </asp:ContentPlaceHolder> 
    <!-- page content --> 
    <asp:ContentPlaceHolder ID="Bar" runat="server"> 
    </asp:ContentPlaceHolder> 
    </body> 
</html> 
सामग्री पृष्ठ
<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server"> 
    <!-- content --> 
</asp:Content> 
<asp:Content ID="Bottom" ContentPlaceHolderID="Bar" runat="server"> 
    <!-- content repeated --> 
</asp:Content> 

रखरखाव

आप जानते हैं, कोड में बातें दोहरा आमतौर पर अच्छा नहीं है। यह रखरखाव की समस्या पैदा करता है।

मास्टर पृष्ठ
<html> 
    <body> 
    <asp:ContentPlaceHolder ID="Foo" runat="server"> 
    </asp:ContentPlaceHolder> 
    <!-- page content --> 
    <asp:ContentPlaceHolder ID="Foo" runat="server"> 
    </asp:ContentPlaceHolder> 
    </body> 
</html> 
सामग्री पृष्ठ
<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server"> 
    <!-- content (no repetition) --> 
</asp:Content> 

संभव: निम्नलिखित मैं करना चाहते हैं लेकिन स्पष्ट रूप से दोहराया आईडी गुण की वजह से काम नहीं करेगा क्या है?

क्या एएसपीनेट वेबफॉर्म का उपयोग करके ऐसा करने का कोई तरीका है? समाधान को उपरोक्त सामग्री के समान नहीं होना चाहिए, इसे केवल उसी तरह काम करने की आवश्यकता है।

नोट्स

मैं दृश्य स्टूडियो में asp.net 3.0 का उपयोग कर रहा 2008

+1

मेरे पास एक समान समस्या है, लेकिन मैं केवल उस कोड में शीर्षक (विभिन्न कारणों से) को डुप्लिकेट करना चाहता हूं। – Dave

उत्तर

3

जैसा कि अन्य ने कहा है, सामग्री के आधार पर वहां शॉर्टकट हैं जो सामग्री के प्रकार के आधार पर लिया जा सकता है।

मान लीजिए कि आपको "सामग्री" को पूरी तरह से एएसपीनेट कोड के रूप में कार्य करने की आवश्यकता है, तो मैं प्रत्येक सामग्री पृष्ठ के लिए UserControl का सुझाव दूंगा जिसमें सामग्री स्वयं ही होगी और फिर आपको कोड की एक पंक्ति को डुप्लिकेट करने की आवश्यकता होगी।

उदाहरण

मास्टर पृष्ठ

<html> 
    <body> 
     <asp:ContentPlaceHolder ID="Foo" runat="server"> 
     </asp:ContentPlaceHolder> 
     <!-- page content --> 
     <asp:ContentPlaceHolder ID="Bar" runat="server"> 
     </asp:ContentPlaceHolder> 
    </body> 
</html> 

सामग्री पृष्ठ

<asp:Content ID="Top" ContentPlaceHolderID="Foo" runat="server"> 
    <uc1:Page1Control id="page1Control1" runat="server" /> 
</asp:Content> 
<asp:Content ID="Bottom" ContentPlaceHolderID="Bar" runat="server"> 
    <uc1:Page1Control id="page1Control2" runat="server" /> 
</asp:Content> 
+0

प्रतिक्रिया के लिए धन्यवाद। यह काम करेगा, लेकिन मुझे लगता है कि यह कोड को दोहराने से अधिक रखरखाव की समस्या पैदा करेगा क्योंकि मुझे प्रत्येक पृष्ठ के लिए एक अलग फ़ाइल में अलग नियंत्रण की आवश्यकता होगी। – brad

+1

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

+0

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

1

आप एक ही के लिए एक आम उपयोगकर्ता नियंत्रण बना सकते हैं और शीर्ष & तल में आपके मास्टर पृष्ठ में जोड़ सकते हैं। आप यह बताते हुए एक संपत्ति बना सकते हैं कि नियंत्रण शीर्ष या नीचे लोड हो गया है या नहीं।

0

सामग्री के आधार पर आप कोड में ऐसा करने में सक्षम हो सकते हैं। यदि यह सिर्फ HTML है तो इसे एक चर में डाल दें और इसे दूसरे को असाइन करें। यदि आपके पास नियंत्रण है, तो आप नियंत्रण संग्रह पर लूप कर सकते हैं और डुप्लिकेट नियंत्रण बना सकते हैं और इसे दूसरे क्षेत्र में रख सकते हैं। किसी भी मामले में दूसरा स्थान एक कंटेंट प्लेसहोल्डर नहीं होगा जो एक div को देय होना चाहिए।

5

मामले में जहां आप सिर्फ एक स्ट्रिंग दोहराना चाहते हैं में, यह मेरे लिए काम किया:

<asp:ContentPlaceHolder ID="TitleContent" runat="server" /> 

सी एक के रूप में कहीं संदर्भित किया: कि हालांकि कार्रवाई की सही पाठ्यक्रम किया जा रहा है :) पर

<% Dim title As LiteralControl = TitleContent.Controls.Item(0) 
    Response.Write(title.Text) 
%> 

कोई वारंटी

+0

एक बहुत अच्छा बिंदु डेव, मैंने वास्तव में अपने लक्ष्यों को पूरा करने के लिए इस तरह की चीज के साथ खेला है। – brad

5

अरे, किसी को अभी भी इस यहाँ के लिए एक समाधान की जरूरत है अगर मैं क्या किया है: में यह रखो आपके मास्टर पेज की कोड फ़ाइल

protected override void RenderChildren(HtmlTextWriter writer) 
{ 
    Control mainPlaceHolder = FindControl("MainContentPlaceHolder"); 
    Control doublePlaceHolder = FindControl("ContentDoublePlaceHolder"); 

    StringBuilder sb = new StringBuilder(); 

    using (StringWriter sw = new StringWriter(sb)) 
    using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
    { 
     mainPlaceHolder.RenderControl(tw); 
    } 

    LiteralControl lc = new LiteralControl(sb.ToString()); 
    doublePlaceHolder.Controls.Add(lc); 

    base.RenderChildren(writer); 
} 

मुझे यहां प्रदर्शन के मुद्दों के बारे में निश्चित नहीं है, लेकिन यह निश्चित रूप से काम करता है।

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