2011-02-27 18 views
5

मैं मौजूदा एएसपी.NET उपयोगकर्ता नियंत्रण में कुछ कस्टम जावास्क्रिप्ट कार्यक्षमता में निर्माण कर रहा हूं। । Usercontrol नियंत्रण यह तो में नीडिंत है की संपत्ति के बारे में पता करने की जरूरत है, मैं इस तरह एक वैश्विक जावास्क्रिप्ट चर बजाय एक expando विशेषता का उपयोग के लिए चयन समाप्त हो गया:मैं उपयोगकर्ता नियंत्रण में एक विस्तार गुण कैसे जोड़ूं?

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled) 

हालांकि, हालांकि expando उत्पादन होता है क्लाइंट को ठीक से, उपयोगकर्ता नियंत्रण में HTML में कोई समान तत्व नहीं है। तो, निम्न JavaScript कि ASP.NET द्वारा स्वतः जेनरेट की एक "वस्तु रिक्त है" हो जाता है त्रुटि:

var ctl00_MainContentHolder_Payment_CreditCardInput1 = document.all ? document.all["ctl00_MainContentHolder_Payment_CreditCardInput1"] : document.getElementById("ctl00_MainContentHolder_Payment_CreditCardInput1"); 
ctl00_MainContentHolder_Payment_CreditCardInput1.validatorsenabled = "False"; 

मैं एक छोटे से जांच कर किया था और this page की खोज की यह दर्शाता है कि IWebPart इंटरफेस को लागू करने यह कर सकता है, लेकिन मैं के साथ की कोशिश की कोई भाग्य नहीं।

क्या उपयोगकर्ता नियंत्रण को सर्वर नियंत्रण जैसे टैग बनाने का कोई तरीका है? या पूरी बात एक सर्वर नियंत्रण में परिवर्तित करने का एकमात्र विकल्प है (जो इस मामले में वेबसाइट डिजाइन के अनाज के खिलाफ जाता है)?

यदि किसी के पास कोई अन्य विचार है तो उपयोगकर्ता नियंत्रण में साझा जावास्क्रिप्ट संपत्ति घोषित करने के लिए मैं अन्य सुझावों के लिए खुला हूं।

+0

सुनिश्चित नहीं हैं कि आपके मामला? – gbs

+0

दिलचस्प विचार। एक छिपे हुए क्षेत्र को मेरे उपयोगकर्ता नियंत्रण में निहित किया जा सकता है, हालांकि अभी भी यह मुद्दा है कि इसमें किस नियंत्रण में निहित है, यह पता चलेगा कि छिपे हुए क्षेत्र का नाम कैसा है। ध्यान रखें कि किसी पृष्ठ पर उपयोगकर्ता नियंत्रण के एक से अधिक उदाहरण हो सकते हैं। – NightOwl888

उत्तर

2

मैं सूचीबद्ध एक बेहतर समाधान के बाद अपने मूल एक

मैं एक समाधान पाया पाया।

ऐसा लगता है (जब मैं इस शब्द की खोज करता हूं तो प्रतिक्रिया की कमी और परिणामों की कमी के कारण) कि अधिकांश लोग विस्तारित गुणों और उनकी उपयोगिता से अनजान हैं। आप जानते हैं कि जब आप ASP.NET पृष्ठ पर सत्यापन नियंत्रण जोड़ते हैं और आपको उस पृष्ठ के निचले हिस्से में जावास्क्रिप्ट का बड़ा दिखने वाला ब्लॉक मिलता है जो गुणों का एक समूह सेट करता है (जैसे सक्षम और त्रुटि)? मैं वही हूं जिसका मैं जिक्र कर रहा हूं। वे पृष्ठ का उपयोग कर पृष्ठ पर आउटपुट हो सकते हैं। क्लाइंटस्क्रिप्ट.रिएस्टरएक्सपांडाएट्रिब्यूट() विधि - अनिवार्य रूप से वे आपके मार्कअप को वैध HTML बनाना चाहते हैं, जबकि आपको जावास्क्रिप्ट के साथ उपयोग के लिए अतिरिक्त (सार्थक) गुण जोड़ने की अनुमति मिलती है। उन्हें जोड़ा जाता है और एचटीएमएल डोम के माध्यम से पहुंचा जा सकता है, लेकिन वे वास्तव में HTML में नहीं हैं।

वैसे भी, मेरे समाधान पर वापस। मैंने बस उपयोगकर्ता नियंत्रण में 2 शाब्दिक नियंत्रण जोड़े - एक बहुत शुरुआत में, और एक बहुत अंत में, और कोडबींड में मैंने उपयोगकर्ता नियंत्रण की आईडी के साथ नियंत्रण तत्व के लिए मार्कअप जोड़ा (चूंकि उपयोगकर्ता नियंत्रण एक आउटपुट नहीं करता है) । तो मार्कअप इस तरह दिखता है:

Me.litControlBegin.Text = String.Format("<div id=""{0}"" class=""creditcardinput"">", Me.ClientID) 
Me.litControlEnd.Text = "</div>" 

अब एक तत्व एचटीएमएल कि UserControl के आईडी (ClientID) से मेल खाती है में मौजूद नहीं होगा:

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="CreditCardInput.ascx.vb" Inherits="BVModules_Controls_CreditCardInput" %> 
<asp:Literal ID="litControlBegin" runat="server" /> 

<!-- User Control Content Here --> 

<asp:Literal ID="litControlEnd" runat="server" /> 

फिर codebehind में, मैं ऐसा किया। जो अनिवार्य रूप से मुझे विस्तारित विशेषताओं को जोड़ने के लिए एक अद्वितीय नामस्थान प्रदान करता है - और इन विशेषताओं को आसानी से पहचानने के लिए अन्य नियंत्रणों के लिए एक तरीका और उन्हें अपने उपयोगकर्ता नियंत्रण से संबद्ध करता है।

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled) 

कौन सा नहीं रह दुर्घटनाओं, HTML तत्व करने के लिए धन्यवाद मैं मैन्युअल रूप से कहा: expando विशेषता तो इस कोड का उपयोग जोड़ा गया है। यह अच्छा होगा अगर उपयोगकर्ता नियंत्रण में नलसाजी इस विवरण की देखभाल करने के लिए होती है जैसे कि यह सर्वर नियंत्रण के साथ है, लेकिन यह कामकाज एक उपयुक्त विकल्प है।

बेहतर समाधान

हमेशा की तरह, आप को पार्स स्ट्रिंग का सहारा करने के लिए है जब आप एक करीब एक बेहतर तरीका है कि क्या वहाँ देखने के लिए ले जाना चाहिए। इस बार वहां एक होता है - रेंडर विधि को ओवरराइड करें (बस एक सर्वर नियंत्रण की तरह) और उत्पादन का उत्पादन करने के लिए HtmlTextWriter पर अंतर्निहित विधियों का उपयोग करें।

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter) 
    writer.AddAttribute(HtmlTextWriterAttribute.Id, Me.ClientID) 
    writer.RenderBeginTag(HtmlTextWriterTag.Div) 
    MyBase.Render(writer) 
    writer.RenderEndTag() 
End Sub 

यह कार्यात्मक मेरे अन्य समाधान में कोड के बराबर है - यह मेरे usercontrol की आईडी के साथ एक div टैग पैदा करता है। हालांकि, इसे मूल कोड की तरह पेज_लोड में होने के लिए अतिरिक्त कोड की आवश्यकता नहीं है, फ्रेमवर्क को बेहतर तरीके से उपयोग करता है, और किसी भी स्ट्रिंग स्वरूपण या समावेशन की आवश्यकता नहीं होती है।

अब, यह लाइन सीधे usercontrol के लिए एक expando विशेषता (जावास्क्रिप्ट में) जोड़ना होगा: अगर मैं इसे सही ढंग से समझ रहा हूँ, लेकिन आपको लगता है एक hiddenfield में किसी भी काम का हो सकता है

Page.ClientScript.RegisterExpandoAttribute(Me.ClientID, "validatorsenabled", Me.ValidatorsEnabled)