2008-10-08 13 views
7

मैं यहाँ विचारों और राय के लिए देख रहा हूँ, नहीं एक "वास्तविक जवाब है", मुझे लगता है ...Vb6 "टैग" संपत्ति ASP.Net में समतुल्य है? एक

वर्ष VB6 दिनों में वापस, वहाँ इस संपत्ति "टैग" सभी नियंत्रण में कहा जाता था, कि था नियंत्रण से संबंधित कस्टम जानकारी स्टोर करने के लिए उपयोगी तरीका। हर एक नियंत्रण यह था, और सभी आनंद था ...

अब, नेट (कम से कम WebForms के लिए) में, ऐसा नहीं है कि वहाँ अब और है ...

है किसी को भी है कि के लिए एक अच्छा प्रतिस्थापन है?

मुझे यह समस्या बहुत बार मिलती है, जहां मेरे पास जीवन चक्र में अलग-अलग समय पर चलने वाले विभिन्न कार्य होते हैं, और वे मेरे नियंत्रणों के साथ सामान करते हैं, और मैं उन्हें अलग-अलग रखना चाहता हूं, लेकिन किसी को जानकारी उत्तीर्ण करनी चाहिए विशिष्ट नियंत्रण के बारे में दूसरे के लिए।

मैं एक लाख विकल्प (मॉड्यूल-स्तरीय शब्दकोश के साथ शुरू करना, स्पष्ट रूप से) के बारे में सोच सकता हूं, लेकिन कोई भी अच्छा ओल टैग के रूप में साफ नहीं है।

(नोट: मैं जानता हूँ कि मैं सभी नियंत्रण उपवर्ग और इसके बजाय मैं था बल्कि नहीं मेरी संस्करण का उपयोग कर सकते हैं।)

कोई सुझाव? आप इसे सामान्य रूप से कैसे हल करते हैं? किसी भी विचार पर उन्होंने इसे क्यों हटा दिया पहला स्थान?

संपादित करें: मैं कुछ अनुरोध की तलाश कर रहा हूं, अंतर-अनुरोध नहीं। मुझे अभी भी पोस्टबैक पर रहने के लिए इस जानकारी की आवश्यकता नहीं है। यह _Load और _PreRender विधियों के बीच है, उदाहरण के लिए।

EDIT2: मुझे अपना एएसपी.Net पता है और मुझे डेस्कटॉप और वेब, दोस्तों के बीच का अंतर पता है! मैं बस उस अमूर्तता का उपयोग करने की कोशिश कर रहा हूं जो नेट मुझे अधिकतम देता है। मैं ट्रेडऑफ समझता हूं, मेरा विश्वास करता हूं, और कृपया यह मानने का उत्तर दें कि मैं करता हूं।

उत्तर

4

नहीं, कोई प्रत्यक्ष समकक्ष नहीं है, लेकिन यदि आप फ्रेमवर्क के v3.5 का उपयोग कर रहे हैं, तो आप इस कार्यक्षमता को विस्तार विधि का उपयोग करके आसानी से जोड़ सकते हैं। उदाहरण के लिए:

Imports System.Runtime.CompilerServices 

Public Module Extensions 
    <Extension()> _ 
    Public Sub SetTag(ByVal ctl As Control, ByVal tagValue As String) 
    If SessionTagDictionary.ContainsKey(TagName(ctl)) Then 
     SessionTagDictionary(TagName(ctl)) = tagValue 
    Else 
     SessionTagDictionary.Add(TagName(ctl), tagValue) 
    End If 
    End Sub 

    <Extension()> _ 
    Public Function GetTag(ByVal ctl As Control) As String 
    If SessionTagDictionary.ContainsKey(TagName(ctl)) Then 
     Return SessionTagDictionary(TagName(ctl)) 
    Else 
     Return String.Empty 
    End If 
    End Function 

    Private Function TagName(ByVal ctl As Control) As String 
    Return ctl.Page.ClientID & "." & ctl.ClientID 
    End Function 

    Private Function SessionTagDictionary() As Dictionary(Of String, String) 
    If HttpContext.Current.Session("TagDictionary") Is Nothing Then 
     SessionTagDictionary = New Dictionary(Of String, String) 
     HttpContext.Current.Session("TagDictionary") = SessionTagDictionary 
    Else 
     SessionTagDictionary = DirectCast(HttpContext.Current.Session("TagDictionary"), _ 
      Dictionary(Of String, String)) 
    End If 
    End Function 
End Module 

फिर, अपने एएसपी.नेट पृष्ठों में, पहले अपने एक्सटेंशन को दायरे में लाएं, ई।छ:

Imports WebApplication1.Extensions 

... और फिर वांछित के रूप में यह अपने नियंत्रण का उपयोग:

TextBox1.SetTag("Test") 

Label1.Text = TextBox1.GetTag 

बाद में संपादित: और तुम सच में, सच नहीं सत्र वस्तु में अपने टैग स्टोर करने के लिए चाहते हैं, इसके बजाय उन्हें अपने व्यूस्टेट में भरना संभव है। निश्चित रूप से यह इच्छा मतलब है कि आपके टैग उपयोगकर्ता के लिए भेजा पृष्ठ मार्कअप में उजागर किया जाएगा (सुलझा रूप में यद्यपि), और, दुर्भाग्य से, कि कुछ प्रतिबिंब फू की आवश्यकता है, के बाद से एक पृष्ठ का ViewState संपत्ति के रूप में चिह्नित किया गया है किसी कारण से 'संरक्षित'।

तो, यह कोड काफी मनोरंजन प्रयोजनों के लिए ही है, विचार किया जाना चाहिए जब तक आप वास्तव में की तरह कोड समीक्षा के दौरान भौहें बढ़ाने के लिए:

<Extension()> _ 
    Public Sub SetTag(ByVal ctl As Control, ByVal tagValue As String) 
    ViewState.Add(ctl.ID & "_Tag", tagValue) 
    End Sub 

<Extension()> _ 
    Public Function GetTag(ByVal ctl As Control) As String 
    Return ViewState(ctl.ID & "_Tag") 
    End Function 

Private Function ViewState() As Web.UI.StateBag 
    Return HttpContext.Current.Handler.GetType.InvokeMember("ViewState", _ 
       Reflection.BindingFlags.GetProperty + _ 
       Reflection.BindingFlags.Instance + _ 
       Reflection.BindingFlags.NonPublic, _ 
       Nothing, HttpContext.Current.CurrentHandler, Nothing) 
End Function 

अंतिम संपादन (मैं वादा करता हूँ ...)। और यहां प्रतिबिंब से छुटकारा पाने का एक तरीका है: सबसे पहले, एक उपयोग योग्य संपत्ति स्तर के साथ व्यूस्टेट संपत्ति का पर्दाफाश करने के लिए एक नई कक्षा बनाएं, फिर Web.UI के बजाय अपना कोड-बेहिंड (.aspx.vb) कक्षाएं प्रबंधित करें। पृष्ठ, जैसे:

Public Class PageEx 
    Inherits System.Web.UI.Page 

    Friend ReadOnly Property ViewStateEx() As Web.UI.StateBag 
    Get 
     Return MyBase.ViewState 
    End Get 
    End Property 
End Class 

अब, अपने एक्सटेंशन मॉड्यूल में आप इस संपत्ति नव परिभाषित के रूप में उपयोग कर सकते हैं:

Private Function ViewState() As Web.UI.StateBag 
    Return DirectCast(HttpContext.Current.Handler, PageEx).ViewStateEx 
End Function 

फिर भी एक हैक का एक सा है, लेकिन प्रतिबिंब का उपयोग कर अधिक से अधिक स्वीकार्य .. ।

+0

वाह। यह जो कुछ मैं पूछ रहा था उसके करीब है और यह मानने का कोई तरीका नहीं है। मैं सत्र की बात के बारे में बहुत खुश नहीं हूं, लेकिन मुझे निश्चित रूप से इस एक्सटेंशन चीज को सीखना होगा (मैं v2.0 का उपयोग कर रहा हूं, लेकिन अब मैं माइग्रेट करूंगा :- डी) –

+0

यह वास्तव में बहुत चालाक है! –

+0

अच्छा! मैं आपको इसके लिए और अधिक अंक देना पसंद करूंगा! उम्मीद है कि वे किस कर्म के बारे में बात कर रहे हैं, उन्हें लागू कर देंगे ... –

0

आप कुछ नियंत्रण में विशेषताएं जोड़ने सकता है, लेकिन है कि कुछ बुरा एचटीएमएल, कुछ <div attrName="attrValue"> की तरह बनाए नियंत्रण के आसपास जोड़ने के लिए लगता है ... (यह एक अवधि हालांकि हो सकता है)

+0

हाँ, मैं टैग हालांकि बाहर जा नहीं करना चाहती। यह एक आंतरिक चीज है। प्लस, यह बाद में अवैध HTML है (मुझे एएसपी.Net परवाह नहीं है वैसे भी यह हर समय करता है, लेकिन फिर भी) –

+0

बिल्कुल क्यों मैं उनका उपयोग नहीं करता! – harriyott

0

मुझे यकीन है कि क्या नहीं कर रहा हूँ टैग संपत्ति VB6 में किया था, लेकिन हो सकता है आप वेब नियंत्रण की Attributes संपत्ति की तलाश में हैं:

MyImgCtrl.Attributes["myCustomTagAttribute"] = "myVal"; 
+0

नहीं। एचटीएमएल के लिए विशेषताएं आउटपुट। मुझे कुछ आंतरिक चाहिए। –

0

आप ASP.Net के बारे में पूछा, लेकिन VB6 एक डेस्कटॉप भाषा था, और इसलिए यह है 'tagged' नियंत्रण थे। क्लासिक एएसपी के लिए इस्तेमाल किए गए वीबीस्क्रिप्ट में वास्तव में नियंत्रण की अवधारणा नहीं थी।

अब नेट में, डेस्कटॉप नियंत्रण के लिए आप विरासत का उपयोग कर सकते हैं, जो पुरानी टैग संपत्ति की तुलना में कहीं अधिक शक्तिशाली है। विरासत वेब नियंत्रण पर भी लागू होती है, हालांकि आपको इसे पकड़ने के लिए इसका उपयोग करने के बारे में सावधान रहना होगा।

+0

हाँ, और उसके बाद आपको अपने द्वारा बनाए गए प्रत्येक नियंत्रण को उप-क्लास करना होगा। अछा नहीं लगता। मुझे वेब और डेस्कटॉप के बीच अंतर मिलता है, और एएसपी.Net बहुत डेस्कटॉप जैसा है, और उसके पास नियंत्रण है। उन्हें वहां टैग जोड़ा जाना चाहिए था। –

+0

नहीं, आपको केवल उन नियंत्रणों को उपclass करना होगा जहां आप टैग का उपयोग करना चाहते हैं। आपको शायद वैसे भी उपclassing होना चाहिए। –

-1

आप एएसपी का उपयोग कर सकते हैं: पोस्ट के बीच डेटा स्टोर करने के लिए छिपे हुए नियंत्रण। जैसा कहता है, यदि आप इसका मूल्य खो देते हैं तो टैग प्रॉपर्टी रखने का कोई मतलब नहीं है।

+0

उह, यहां तक ​​कि uglier। और फिर, वे व्यूस्टेट को क्रमबद्ध कर सकते थे, इसे खोने की कोई आवश्यकता नहीं थी। और मेरे लिए मूल्य है, भले ही आप इसे खो दें। –

+0

कृपया बेहतर बताएं कि आप पहले क्या चाहते हैं –

-1

Tag संपत्ति हमेशा एक अजीब था मस्सा की तरह बात यह है कि कुछ ऐसा था जिसके रूप में आप इच्छित डेटा को लटका सकते हैं। लेकिन यह दृढ़ता से टाइप नहीं किया गया था और यह वास्तव में एक सुसंगत डिजाइन के लिए नहीं बनाया था। संपत्ति ने खुद को एक अजीब घुंडी की तरह नियंत्रण से लटका दिया। उन्होंने वीबी 6 से पोर्टिंग कोड को सुविधाजनक बनाने के लिए इसे WinForms में रखा। नया WPF Control कक्षा में Tag नहीं है।

.NET के साथ आपके पास पूर्ण ऑब्जेक्ट-ओरिएंटेशन और पर्याप्त प्रकार के पॉलीमोर्फिज्म हैं, इसलिए आप जो भी अतिरिक्त जानकारी कोड के साथ जोड़ना चाहते हैं, उसे दृढ़ता से टाइप कर सकते हैं, भले ही यह सबक्लास या Dictionary<Control,TValue> में हो।

यदि यह एक एकल Page अनुरोध में है और आप प्रत्येक मान प्रकार (उदा, Dictionary<Control,string> और Dictionary<Control,BusinessObject>) वास्तव में आप क्या जरूरत के लिए किया जाना चाहिए पृष्ठ अपने आप में एक सामान्य समाधान एक शब्दकोश चाहते हैं।

+0

के लायक होने की तुलना में अधिक परेशानी है। लेकिन यह गंभीरता से टैग की तुलना में बहुत अधिक है। मैं जो कुछ कह रहा हूं उसे प्राप्त करता हूं और मैं सहमत हूं, लेकिन यह अभी भी बहुत उपयोगी था। आप "ग्लोबल" वैरिएबल के रास्ते से पूरी तरह से बाहर होने के बजाय, जहां डेटा होना चाहिए, उससे संबंधित डेटा डाल रहे हैं। –

3

तुम भी बजाय inheritence का उपयोग कर के समग्र पैटर्न का उपयोग कर सकते हैं:

public class TaggedControl<TControl, TTag> : Control 
where TControl : Control, new() 
{ public TaggedControl() {this.Control= new TControl();} 

    public TControl Control {get; private set;} 
    public TTag  Tag  {get; set;}  

    protected override void CreateChildControls(){Controls.Add(Control);} 
} 

var textBox = new TaggedControl<TextBox, string>(); 
textBox.Tag = "Test"; 
label.Text = textBox.Tag; 
संबंधित मुद्दे