2013-08-20 8 views
5

यह कैसे जांचें कि ContentPlaceHolder बिल्कुल खाली है या नहीं?यह कैसे जांचें कि ContentPlaceHolder खाली है या नहीं?

ContentPlaceHolder में केवल टैग और नियंत्रण के बिना टेक्स्ट है।

उदाहरण Page.Master:

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

उदाहरण Test.aspx:

<asp:Content runat="server" ContentPlaceHolderID="Content"> 
    Custom text without controls. Content.Controls.Count is 0 and Content.HasControls is false. 
</asp:Content> 

मैं क्या करने की जरूरत है जब प्लेसहोल्डर खाली है डाल कि एक डिफ़ॉल्ट सामग्री एक और नियंत्रण में है।

ओवरराइट ने उसी प्लेसहोल्डर के लिए दो बार कोशिश की लेकिन गतिशील लोड के दौरान मुझे त्रुटि मिलती है।

+0

क्या आप पूरा करने के लिए कोशिश कर रहे हैं? – Patrick

उत्तर

4

आप एक विधि है कि एक स्ट्रिंग में सामग्री नियंत्रण प्रदान करेगा लागू कर सकते हैं, तो स्ट्रिंग जाँच खोजने के लिए wheahter यह किसी भी गैर शामिल सफेद अंतरिक्ष वर्ण:

private bool HasContent(Control ctrl) 
{ 
    var sb = new System.Text.StringBuilder(); 
    using (var sw = new System.IO.StringWriter(sb)) 
    { 
     using(var tw = new HtmlTextWriter(sw)) 
     { 
      ctrl.RenderControl(tw); 
     } 
    } 

    var output = sb.ToString().Trim(); 

    return !String.IsNullOrEmpty(output); 
} 

protected void Page_PreRender(object sender, EventArgs e) 
{ 
    var placeholder = Master.FindControl("FeaturedContent"); 
    var hasContent = HasContent(placeholder); 
} 
+0

नियंत्रण। गणना 0 है लेकिन पाठ है, खाली नहीं है। –

+0

क्षमा करें, एक टेम्पलेटेड सर्वर नियंत्रण .aspx पृष्ठ से मार्कअप को सर्वर नियंत्रण में परिवर्तित नहीं करता है। मैंने अपना उत्तर एक संभावित दृष्टिकोण के साथ अपडेट किया है जिसका आप उपयोग कर सकते हैं: एक स्ट्रिंग बिल्डर में सामग्री नियंत्रण प्रदान करें और जांचें कि इसमें कोई गैर-सफेद स्पेस वर्ण हैं या नहीं। – defrost

+0

बहुत बहुत धन्यवाद :) –

1

आपको पहले मास्टर पेज पर ContentPLaceHolder खोजने की आवश्यकता है। फिर आप पहले नियंत्रण (जो हमेशा मौजूद हैं) LiteralControl पर डाल सकते हैं और इसकी Text संपत्ति का उपयोग कर सकते हैं।

तो इस सामग्री-पेज के Page_Load से अपेक्षा के अनुरूप काम करता है:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var cph = Page.Master.FindControl("Content") as ContentPlaceHolder; 
    if (contentPlaceHolder != null) 
    { 
     string textualContent = ((LiteralControl) cph.Controls[0]).Text; 
     if (string.IsNullOrEmpty(textualContent)) 
     { 
      // ... 
     } 
    } 
} 
+0

विजुअल स्टूडियो का कहना है: ArgumentOutOfRangeException। मेरा कोड है: स्ट्रिंग textualContent = ((literalControl) CustomHeader.Controls [0])। पाठ; \t \t \t अगर (string.IsNullOrEmpty (textualContent)) \t \t \t { \t \t \t \t/* carga ला cabecera पोर defecto */ \t \t \t \t UserControl सिर = (UserControl) Page.LoadControl ("~/लेआउट/थीम्स/"+ config.theme चयनित +" /header.ascx "); \t \t \t \t CustomHeader.Controls.Add (head); \t \t \t} –

+0

@WHK: मैंने अपना जवाब संपादित कर लिया है। –

+0

वही समस्या, स्ट्रिंग textualContent = ((LiteralControl) cph.Controls [0]) में तोड़ें। पाठ; एक ही त्रुटि के साथ। जब सामग्री के ऊपर की ओर इशारा करते हैं: ला colección de controles कोई puede modificarse porque el control contiene bloques de código (por ej। <% ... %>)। –

-1

मेरे 2 सेंट:

यह एक निरंतर सामग्री आप सम्मिलित करना होगा और कोई +०१२३१२५७१२४१ वहाँ हो जाएगाबिल्कुल:

<asp:ContentPlaceHolder> 
    <!-- Anything here will be inserted if there's no Content --> 
</asp:ContentPlaceHolder> 
+0

contants का उपयोग न करें। –

+0

मुझे आपकी टिप्पणी समझ में नहीं आ रही है। – ispiro

+0

डाउनवोट क्यों? मुझे लगता है कि इस तरह के मामले को शामिल करने के लिए सवाल काफी व्यापक था। – ispiro

0

यह बदल गया है क्योंकि मैं 4.5 कि HasControls में देख रहा हूँ सच वापसी करता है जब वहाँ Content में केवल शाब्दिक पाठ, एक भी खाली स्थान के है लगता है। मैं अपने मास्टर पृष्ठ में कुछ इस तरह करते हैं:

<asp:Panel id="SidebarPanel" CssClass="Sidebar" runat="server"> 
    <asp:ContentPlaceHolder id="SidebarContent" runat="server" /> 
</asp:Panel> 

Sub Page_Load(...) 
    SidebarPanel.Visible = SidebarContent.HasControls 
End Sub 

यह, साइडबार सामग्री renders अगर कोई है, एक <div class="Sidebar"> अंदर - और पृष्ठ पर एक खाली div बनाते समय कोई सामग्री है बचा जाता है।

1

मैं वास्तव में एक प्रस्तुत करने या जोखिम के लिए सभी कोड चलाने के लिए नहीं चाहता था कि शायद कुछ नियंत्रणों में राज्य हो सकते हैं जो प्रस्तुत किए जाने के बाद बदलते हैं। तो मैं एक और दृष्टिकोण के साथ आया था।

public static int ChildrenCount(ContentPlaceHolder placeholder) 
{ 
    int total = 0; 
    total += placeholder.Controls.OfType<Control>().Where(x => 
     (!(x is ContentPlaceHolder) && !(x is LiteralControl)) || 
     (x is LiteralControl && !string.IsNullOrWhiteSpace(((LiteralControl)x).Text)) 
    ).Count(); 
    foreach (var child in placeholder.Controls.OfType<ContentPlaceHolder>()) 
     total += ChildrenCount(child); 
    return total; 
} 

मेरे लिए पाठ मैं एक सामग्री तत्व में सीधे को रखना होगा उचित सामग्री के साथ एक LiteralControl रूप OfType से लौटा दिया जाएगा। इतना ही नहीं, लेकिन मेरा स्वरूपण ("\ r \ n \ t") भी उसी तरह से वापस किया जाएगा। मुझे बाद के मास्टर पृष्ठों के लिए ContentPlacehold भी मिलेंगे क्योंकि उन्होंने मेरे वेब पृष्ठों में स्लॉट को अगले मास्टर पेज या वास्तविक पृष्ठ पर पास किया था।

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

और फिर अंत में:

if (ChildrenCount(MyContentPlaceholder) == 0) 
    MyContentPlaceholder.Controls.Add(new LiteralControl("My default content!")); 
संबंधित मुद्दे