मैं सूचीबद्ध एक बेहतर समाधान के बाद अपने मूल एक
मैं एक समाधान पाया पाया।
ऐसा लगता है (जब मैं इस शब्द की खोज करता हूं तो प्रतिक्रिया की कमी और परिणामों की कमी के कारण) कि अधिकांश लोग विस्तारित गुणों और उनकी उपयोगिता से अनजान हैं। आप जानते हैं कि जब आप 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)
सुनिश्चित नहीं हैं कि आपके मामला? – gbs
दिलचस्प विचार। एक छिपे हुए क्षेत्र को मेरे उपयोगकर्ता नियंत्रण में निहित किया जा सकता है, हालांकि अभी भी यह मुद्दा है कि इसमें किस नियंत्रण में निहित है, यह पता चलेगा कि छिपे हुए क्षेत्र का नाम कैसा है। ध्यान रखें कि किसी पृष्ठ पर उपयोगकर्ता नियंत्रण के एक से अधिक उदाहरण हो सकते हैं। – NightOwl888