2009-10-16 11 views
10

मेरे पास एक ऐसा पृष्ठ है जिसमें उपयोगकर्ता नियंत्रण का एक समूह है। मैं सीधे सामग्री में "मैक्रोज़" या "प्लेसहोल्डर" रखने में सक्षम होना चाहता हूं जो मेरे कोड में बदल दिया जाएगा। यह वास्तव में कोई फर्क नहीं पड़ता है, लेकिन मैं अपने सीएमएस के रूप में Ektron का उपयोग कर रहा हूँ।आउटपुट से ठीक पहले मैं पूरी एएसपी.NET पेज सामग्री को कैसे संशोधित कर सकता हूं?

क्या कोई पेज इवेंट है जो मैं पूरी रेंडर पेज सामग्री पर एक स्ट्रिंग को प्रतिस्थापित करने के लिए हुक कर सकता हूं, क्लाइंट को भेजे जाने से ठीक पहले?

protected override void Render(HtmlTextWriter writer) 
{ 
    string content = string.Empty; 

    using (var stringWriter = new StringWriter()) 
    using (var htmlWriter = new HtmlTextWriter(stringWriter)) 
    { 
     // render the current page content to our temp writer 
     base.Render(htmlWriter); 
     htmlWriter.Close(); 

     // get the content 
     content = stringWriter.ToString(); 
    } 

    // replace our placeholders 
    string newContent = content.Replace("$placeholder1$", "placeholder1 data").Replace("$placeholder2$", "placeholder2 data"); 

    // write the new html to the page 
    writer.Write(newContent); 
} 

उत्तर

8

आप विधि प्रस्तुत करना अधिभावी की कोशिश की है:

अद्यतन

यहाँ कोड है कि मैं वर्तमान में यह पूरा करने का उपयोग कर रहा है?

protected override void Render(HtmlTextWriter writer) 
{ 
    StringBuilder htmlString = new StringBuilder(); // this will hold the string 
    StringWriter stringWriter = new StringWriter(htmlString); 
    HtmlTextWriter tmpWriter = new HtmlTextWriter(stringWriter); 
    Page.Render(tmpWriter); 
    writer.Flush(); 

    writer.Write(DoReplaceLogic(htmlString.ToString());); 
} 
+0

हां, यह सही जगह है लेकिन क्या यह संभव है (और बुद्धिमान) रीसेट करने और स्ट्रीम पढ़ने के लिए? –

+1

आप स्ट्रीम को कभी भी "रीसेट नहीं कर रहे हैं" क्योंकि इसे अभी तक भेजा नहीं गया है। मैं निश्चित नहीं हूं कि इसके बुद्धिमान, नहीं, मैंने अभी प्रश्न का उत्तर दिया है – JustLoren

+0

मैं अभी इस विधि का उपयोग कर रहा हूं, लेकिन यह देखने के लिए उत्तर देने के लिए इंतजार करूँगा कि कोई बेहतर समाधान है या नहीं। असल में मैं ... पृष्ठ को एक अस्थायी बफर पर लिखने दें। बफर संशोधित करें। संशोधित एक के साथ मूल बफर को बदलें। –

1

क्या आपने जीवन चक्र में प्रीरेंडर ईवेंट देखा है?

इससे पहले कि इस घटना होती है:

• पृष्ठ वस्तु प्रत्येक नियंत्रण के लिए और पेज के लिए EnsureChildControls कहता है।

• प्रत्येक डेटा बाध्य नियंत्रण जिसका डेटासोर्सिड संपत्ति सेट है, यह डेटाबैंड विधि कॉल करता है।

• प्रीरेंडर ईवेंट पृष्ठ पर प्रत्येक नियंत्रण के लिए होता है। ईवेंट का उपयोग पृष्ठ या उसके नियंत्रण की सामग्री में अंतिम परिवर्तन करने के लिए करें।

मुझे विश्वास है कि यह आखिरी जगह है जिससे आप ऐसा कुछ कर सकते हैं।

इससे पहले कि इस घटना होती है, ViewState पेज के लिए और सभी नियंत्रण के लिए सहेज लिया गया है: अगली घटना SaveStateComplete, जो दस्तावेज़ के अनुसार इस व्यवहार किया है। में कोई भी परिवर्तन इस बिंदु पर पृष्ठ या नियंत्रण पर अनदेखा किया जाएगा। इस घटना का उपयोग करें उन कार्यों को निष्पादित करें जिन्हें सहेजने के लिए दृश्य स्थिति की आवश्यकता होती है, लेकिन इससे नियंत्रण में परिवर्तन नहीं होते हैं।

0

सरलतापूर्ण उत्तर जो दिमाग में आता है, एएसपी का उपयोग करना है: आपके "प्लेसहोल्डर" के लिए शाब्दिक नियंत्रण। आप पेज लोड के दौरान अपनी सामग्री सेट कर सकते हैं, या आप प्रीरेंडर इवेंट में हुक कर सकते हैं और फिर सेट कर सकते हैं।

+0

कोड में टाइपो को सही किया, दुर्भाग्यवश, मैं ऐसा नहीं कर सकता क्योंकि ये "प्लेसहोल्डर्स" उस सामग्री के अंदर होंगे जो उपयोगकर्ता नियंत्रण के अंदर प्रस्तुत किया जाता है, जिसे मैं स्पर्श नहीं कर सकता। तो जब तक यह मेरे पास आता है, केवल एक चीज जो मैं करने की उम्मीद कर सकता हूं वह प्रस्तुत सामग्री को देखता है। –

+0

क्षमा करें, मुझे "उपयोगकर्ता नियंत्रण" याद आया, मेरा बुरा। उपयोगकर्ता नियंत्रणों में प्रीरेंडर ईवेंट भी हैं। आपको अपने उपयोगकर्ता नियंत्रणों पर सार्वजनिक गुणों को रखने में सक्षम होना चाहिए, जो पृष्ठ सेट कर सकते हैं, फिर उपयोगकर्ता नियंत्रण प्रतिस्थापन करते हैं। –

0

ऐसा लगता है जैसे आप अपने पृष्ठ के भीतर HTML अक्षर प्राप्त करना चाहते हैं और फिर आप उन्हें पेज_लोड ईवेंट पर उचित सामग्री के साथ प्रतिस्थापित कर सकते हैं।

आपको कुछ साधारण पाठ के विपरीत HTML कोड लिखने की आवश्यकता होगी, लेकिन ऐसा लगता है कि आप अपने स्वयं के जावास्क्रिप्ट कोड को इंजेक्ट कर सकते हैं या जैसा कि यह अच्छा काम करेगा।

5

मुझे पता है कि यह उत्तर आपकी सहायता के लिए नहीं जा रहा है क्योंकि आप इस समस्या को हल कर चुके हैं और आगे बढ़े हैं। यह सिर्फ उन लोगों के लिए है जो भविष्य में इसी तरह की समस्या का सामना करेंगे;)

आपके द्वारा उपयोग किए जा सकने वाले दो दृष्टिकोण हैं।

  1. यह स्वीकृत उत्तर के समान है। लेकिन मैं BasePage में रेंडर विधि को ओवरराइड करने और इस से अपने सभी टेम्पलेट्स को प्राप्त करने की अनुशंसा करता हूं।

  2. एक HttpModule या Global.asax का प्रयोग करें और रिस्पांस ऑब्जेक्ट में एक Filter देते हैं। मेरे लिए यह सौंदर्य भावना को समझता है क्योंकि "फ़िल्टर" संपत्ति आपकी मदद करने के लिए आउटपुट फ़िल्टर करती है जो वास्तव में है जो आप चाहते हैं!

बीटीडब्लू, यह अब तक एकट्रॉन के साथ कैसा चल रहा है? वे मुझे निश्चित रूप से पागल कर रहे हैं!

+0

उत्तर के लिए धन्यवाद। प्रयास के लिए वोट! बेसपेज चीज वास्तव में एक अलग समाधान नहीं है, लेकिन स्वीकार्य एक के अलावा अतिरिक्त है। लेकिन अच्छा विचार है। मुझे लगता है कि बेसपेज क्लास बनाना हमेशा एक अच्छा विचार है कि आपका पूरा पृष्ठ प्राप्त हुआ है। या शायद आपके पास पृष्ठों के प्रकारों के आधार पर 2-3 हो सकता है। एचटीपी मॉड्यूल और फ़िल्टर के लिए, यह एक अच्छा है! फिर, स्वीकृत समाधान के समान, लेकिन प्रतिस्थापन के लिए तर्क पृष्ठ से बाहर निकाला जाएगा। यदि आप एक से अधिक स्थानों में प्रतिस्थापन कर रहे हैं तो यह बहुत अच्छा होगा! अच्छा! –

+0

ओह हाँ ... Ektron ... मैं व्यक्तिगत रूप से इसे पसंद नहीं करता। पूरा उत्पाद गधा पीछे है। उनका एपीआई बदसूरत है, और बहुत ही मजबूत है। पूरा उत्पाद छोटी है, लेकिन कोड खराब हो गया है, इसलिए आपको यह पता लगाने की कोई उम्मीद नहीं है कि वे क्या करने की कोशिश कर रहे थे। उनके समर्थन मंच बहुत अच्छे नहीं हैं। यदि आप एक नया सीएमएस खोज रहे हैं, तो मैं केंटिको की सिफारिश करूंगा। अधिकांश भाग के लिए, आपको कोई कोड लिखना नहीं है। लेकिन जब आप कोड लिखते हैं, तो उनका एपीआई कमाल है! केंटिको के साथ मेरे पास एकमात्र पकड़ है कि उनकी कैशिंग प्रणाली उलझन में है, और डिफ़ॉल्ट रूप से, एक बुद्धिमान तरीके से स्थापित नहीं है। –

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

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