मैं कोड के माध्यम से Web User Controls
बना रहा हूं (मेरा सी # कोड लिखने वाला मार्कअप, कोड-बैक और डिज़ाइनर फ़ाइलों को कॉलबैक पर डिस्क पर)। नियंत्रण सभी ठीक बनाये गये हैं। मैं उन्हें अपने वेब-प्रोजेक्ट में जोड़ सकता हूं और उन्हें एक पेज पर रख सकता हूं।एएससीएक्स नियंत्रण लोड हो रहा है गतिशील रूप से (कोड के माध्यम से)
जब मैं नियंत्रण LoadControl(path)
का उपयोग कर इसे कहते हैं लोड करने का प्रयास:
Unable to load type 'MyNameSpace.UseControlClass'
है जो क्योंकि नियंत्रण अभी तक संकलित नहीं है।
लेकिन मेरी आवश्यकता समाधान को पुन: संकलित किए बिना गतिशील रूप से नियंत्रण लोड करना है।
जब मैं नियंत्रण फाइलें बनाता हूं तो मैं केवल उपयोगकर्ता नियंत्रण को संकलित कैसे कर सकता हूं? जैसा कि यह एकमात्र रास्ता लगता है।
संपादित करें: - मेरा अनुमान है कि फ़ाइल संकलित नहीं है, फिर भी इसे रनटाइम द्वारा लोड करने की अनुमति नहीं है। मैंने CodeDom
कंपाइलर का उपयोग कर कोड फ़ाइल को संकलित करने का प्रयास किया है। जैसा:
var filePath = Server.MapPath(path);
var provider = CSharpCodeProvider.CreateProvider("C#");
var opts = new CompilerParameters(new[] { "mscorlib.dll", "System.Web.dll",
"Telerik.Web.Design.dll", "Telerik.Web.UI.dll",
"Telerik.Web.UI.Skins.dll", "MyCurrentDll.dll"});
opts.GenerateExecutable = false;
opts.GenerateInMemory = true;
var cr = provider.CompileAssemblyFromFile(opts, new string[] { filePath+".cs" });
लेकिन यह शिकायत cannot find metadata file Telerik.Web.Design.dll
के बारे में आदि मैं Telerik पथ हार्डकोड करने के रूप में यह की मेजबानी की व्यवस्था में अलग हो सकता है (हालांकि यह वर्तमान वेब एप्लिकेशन के bin
में है) नहीं करना चाहती। MyCurrentDll.dll
फ़ाइल का डीएलएल है जिसमें से मैं कोड फ़ाइल संकलित कर रहा हूं। मैं इसे कैसे हल करूं?
मेरा विचार कोड फ़ाइल को संकलित करना dll
गतिशील रूप से बनाना और इसे वेब एप्लिकेशन की bin
निर्देशिका में कॉपी करना है। यह मूल रूप से बताई गई समस्या को हल कर सकता है।
EDIT 2: - हिट और परीक्षण के बाद मैं कोड फ़ाइल को गतिशील रूप से संकलित करने और dll
उत्पन्न करने में सक्षम हूं। डीएल उत्पन्न करने और इसे मेरे आवेदन के bin
में रखने के बाद भी मैं virtual path
का उपयोग कर उपयोगकर्ता नियंत्रण लोड करने में सक्षम नहीं हूं। मैंने निम्नलिखित दृष्टिकोण का प्रयास किया है:
var asm = Assembly.Load("ddlPath");
var t = asm.GetType(fullTypeName);//NameSpace.Class
var ctrl = LoadControl(t,null);
इसके बाद ctrl लोड किया गया है। मैं अपनी Id
संपत्ति असाइन करता हूं और इसे asp.net Panel
नियंत्रण में जोड़ता हूं। लेकिन यह पोस्टबैक :(
अब मैं के बाद दिखाई या तो किसी भी तरह गतिशील रूप से संकलित dll के क्रम के लिए उपलब्ध प्रकार (appdomain, हो सकता है) बनाने के लिए इतना है कि जब मैं नियंत्रण लोड आभासी पथ का उपयोग कर इसे ठीक तरह से भरी हुई है और मैं है नहीं है HtmlParseException
मिलता है या नहीं यह पता लगाने क्यों लोड हो रहा है नियंत्रण प्रपत्र Type
नहीं दिखा रहा है
पुनश्च: -। मैं Type
का उपयोग कर एक Label
नियंत्रण लोड किया है और यह ठीक से काम कर रहा है
यह वास्तव में एक दिलचस्प सवाल है। मैं इसके लिए उपयोग के मामले के बारे में नहीं सोच सकता - लेकिन जिस तरह से मैं आम तौर पर इस दृष्टिकोण से संपर्क करता हूं वह एक और असेंबली है जो जानता है कि नियंत्रण कैसे बनाएं और एचटीएमएल आदि को रन टाइम पर कैसे निकालें। संभवतः एक और असेंबली में आपके नए नियंत्रणों को एम्बेड करके एक समान दृष्टिकोण संभव होगा जिसे आप संकलित और लोड कर सकते हैं? मैं इस सवाल को ब्याज के साथ देखूंगा! – dash
@ डैश उपयोग केस यह है कि हम उपयोगकर्ता को कुछ फ़ील्ड (पूर्वनिर्धारित इनपुट प्रकारों के साथ) समूहबद्ध करने और अंतिम उपयोगकर्ता से इनपुट प्राप्त करने की अनुमति देते हैं। मैं इन क्षेत्रों को एम्बेड करने, उपयोगकर्ता नियंत्रण बनाना चाहता हूं। – TheVillageIdiot
कोडबहाइंड के बजाय कोडफाइल में आपके नियंत्रण और होस्टिंग पृष्ठ हैं? – jbl