2011-11-11 11 views
5

प्रस्तुत करना मेरे पास अपनी छोटी परियोजना में UserControl ऑब्जेक्ट्स (ascx फ़ाइलें) का भार है। मैं फिर इस परियोजना को दो परियोजनाओं में संदर्भित करता हूं: आरईएसटी एपीआई (जो एक कक्षा पुस्तकालय परियोजना है) और मुख्य वेबसाइट।प्रोग्रामिंग रूप से एक वेब उपयोगकर्ता कंट्रोल

मुझे यकीन है कि यह वेबसाइट में आसान होगा, Controls.Add किसी भी Panel या एएसपी.NET नियंत्रण में काम करेगा।

हालांकि, एपीआई के बारे में क्या? क्या नियंत्रण के प्रकार को जानकर मैं इस नियंत्रण के एचटीएमएल को प्रस्तुत कर सकता हूं? RenderControl विधि लेखक को कोई HTML नहीं लिखता क्योंकि नियंत्रण का जीवन चक्र भी शुरू नहीं हुआ है।

कृपया ध्यान रखें कि मेरे पास वेब प्रोजेक्ट में नियंत्रण नहीं है, इसलिए मेरे पास ascx फ़ाइल का वर्चुअल पथ नहीं है। तो LoadControl विधि यहां काम नहीं करेगी।

सभी नियंत्रण वास्तव में एक ही आधार नियंत्रण से प्राप्त होते हैं। क्या इस आधार वर्ग के भीतर से कुछ भी मैं कर सकता हूं जो मुझे पूरी तरह से नए उदाहरण से नियंत्रण लोड करने की अनुमति देगा?

उत्तर

8

यह मैंने हाल ही में किया है, अच्छी तरह से काम करता है, लेकिन अगर आप इसे अपने एएसपी.NET ऐप के अंदर उपयोग करते हैं तो पोस्टबैक काम नहीं करेंगे।

[WebMethod] 
public static string GetMyUserControlHtml() 
{ 
    return RenderUserControl("Com.YourNameSpace.UI", "YourControlName"); 
} 

public static string RenderUserControl(string assembly, 
      string controlName) 
{ 
     FormlessPage pageHolder = 
       new FormlessPage() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; //allow for "~/" paths to resolve 

     dynamic control = null; 

     //assembly = "Com.YourNameSpace.UI"; //example 
     //controlName = "YourCustomControl" 
     string fullyQaulifiedAssemblyPath = string.Format("{0}.{1},{0}", assembly, controlName); 

     Type type = Type.GetType(fullyQaulifiedAssemblyPath); 
     if (type != null) 
     { 
      control = pageHolder.LoadControl(type, null); 
      control.Bla1 = "test"; //bypass compile time checks on property setters if needed 
      control.Blas2 = true; 

     }       

     pageHolder.Controls.Add(control); 
     StringWriter output = new StringWriter(); 
     HttpContext.Current.Server.Execute(pageHolder, output, false); 
     return output.ToString(); 
} 


public class FormlessPage : Page 
{ 
    public override void VerifyRenderingInServerForm(Control control) 
    { 
    } 
} 
+0

अच्छी रिक देख रहे हैं। बस मेरी संरचना में इसे लागू करने की कोशिश कर रहा है। एक बात मैंने देखी है - 'एचटीएमएलफॉर्म फॉर्म = नया एचटीएमएलफ़ॉर्म(); '। इस चर का कभी भी उपयोग नहीं किया जाता है, क्योंकि 'form.Controls.Add' टिप्पणी की जाती है? क्या मैं कुछ भूल रहा हूँ? – Connell

+0

मैं अपडेट करूंगा, नियमित रूप से करने का एक तरीका है, लेकिन यदि आपके नियंत्रण में कोई फॉर्म टैग नहीं है या आप प्रोग्रामेटिक रूप से नहीं जोड़ते हैं, तो आपको रनटाइम त्रुटि मिल जाएगी। FormLessPage क्लास आपके लिए बाईपास करता है। –

1

This काम करना चाहिए। आप उस प्रकार का नियंत्रण बना सकते हैं और अपने HtmlTextWriter का उपयोग कर सकते हैं।

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