2008-09-12 11 views

उत्तर

39

यह काम प्रतीत होता है। यदि नियंत्रण है

public void GetHtmlFromMySweetControl(HttpContext context) 
{ 
    HttpRequest httpRequest = context.Request; 
    HttpResponse httpResponse = context.Response; 

    string foo = httpRequest["foo"]; 

    Page pageHolder = new Page(); 
    string path = "~/usercontrols/MySweetControl.ascx"; 
    MySweetControl ctrl = (MySweetControl)pageHolder.LoadControl(path); 
    ctrl.BindProducts(foo); 
    pageHolder.Controls.Add(ctrl); 

    StringWriter sw = new StringWriter(); 
    context.Server.Execute(pageHolder, sw, false); 
    httpResponse.Write(sw.ToString()); 
} 
+6

स्ट्रिंगवाइटर और HtmlTextWriter दोनों लागू करने योग्य IDISposable, ताकि आप उन्हें एक() {} ब्लॉक में लपेटना चाहें। साथ ही, यह 'नियंत्रण' का विस्तार तरीका बनाने के लिए उपयोगी हो सकता है, ताकि आप इसे किसी इंस्टेंस सदस्य से कॉल कर सकें। –

+1

@ डेविड, आप एटीएक्स फ़ाइल को एचटीएमएल में प्रस्तुत करने के साथ कैसे समाप्त हुए? मैंने उपर्युक्त विधि की कोशिश की, लेकिन हमेशा "ऑब्जेक्ट रेफरेंस ऑब्जेक्ट के इंस्टेंस पर सेट नहीं है।" कह रहा है कि मैं जिस उपयोगकर्ता नियंत्रण का संदर्भ दे रहा हूं वह एक उदाहरण नहीं है। विंडोज़ फॉर्म या कंसोल एप्लिकेशन में इसका इस्तेमाल कैसे करना चाहिए? – Princa

+1

डिफ़ॉल्ट स्ट्रिंगवाइटर() कन्स्ट्रक्टर एक नया स्ट्रिंग बिल्डर बनाता है, इसलिए पहले दो लाइनों को केवल System.IO.StringWriter stWriter = new System.IO.StringWriter() के साथ प्रतिस्थापित किया जा सकता है; – Spongeboy

6

अपने नियंत्रण एक वेब उपयोगकर्ता नियंत्रण है, यह कैसे आप HTML इसे किसी अन्य पृष्ठ या हैंडलर से उत्सर्जन करता है करने के लिए मिल सकता है पृष्ठ का हिस्सा नहीं है। a7drew का उत्तर अनावश्यक जटिल लगता है - Context या Server.Execute में कोई आवश्यकता नहीं है।

private string RenderControl() 
{ 
    var sb = new System.Text.StringBuilder(); 
    using (var stWriter = new System.IO.StringWriter(sb)) 
    using (var htmlWriter = new HtmlTextWriter(stWriter)) 
    { 
     var p = new Page(); 
     var ctrl = (YourControl)p.LoadControl("~/controls/building blocks/YourControl.ascx"); 
     ctrl.Visible = true; 

     // do your own init logic if needed 

     p.Controls.Add(ctrl); 
     ctrl.RenderControl(htmlWriter); 
     return sb.ToString(); 
    } 
} 
+0

जब मैं इसे आज़माता हूं, तो HTML द्वारा प्रदान किया गया HTML सामान्य रूप से पृष्ठ पर दिखाई देने से अलग होता है। उदाहरण के लिए, एक एएसपी: समूहिंग टेक्स्ट विशेषता के साथ पैनल। GroupingText विशेषता का मान अब फ़ील्ड और किंवदंती के रूप में प्रस्तुत किया जाता है। यह वांछनीय नहीं है ... इसकी तरह उपयोगकर्ता नियंत्रण कुछ अलग-अलग प्रकार के मोड के तहत प्रस्तुत किया जा रहा है .... पूरी तरह से अलग HTML ... :( – ClearCloud8

+0

अच्छा! मुझे यह भी पता नहीं था कि यह संभव था! यह बहुत ही कुशल तरीकों की अनुमति देता है कैशिंग सामग्री! बहुत बहुत धन्यवाद! – Tillito

6
David Basarab द्वारा

स्वीकृत जवाब काम नहीं करेगा:

public string RenderControlToHtml(Control ControlToRender) 
{ 
    System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    System.IO.StringWriter stWriter = new System.IO.StringWriter(sb); 
    System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(stWriter); 
    ControlToRender.RenderControl(htmlWriter); 
    return sb.ToString(); 
} 
+0

धन्यवाद, यह काम करता है! वैसे, मेरे परीक्षण में, 'ctrl.Visible = true;' लाइन की आवश्यकता नहीं है। –

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