Нет, прямого эквивалента нет, но если вы используете v3.5 Framework, вы можете легко добавить эту функцию, используя метод расширения. Например:
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
Затем на своих страницах ASP.NET сначала перенесите ваши расширения в область действия, например:
Imports WebApplication1.Extensions
... и затем используйте его как хотите:
TextBox1.SetTag("Test")
Label1.Text = TextBox1.GetTag
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ: и если вы действительно, действительно, не хотите хранить свои теги в объекте Session, вместо этого можно вставить их в Viewstate. Это, конечно, будет означать, что ваши теги будут отображаться в разметке страницы, отправленной пользователю (хотя и в запутанном виде), и, к сожалению, что требуется некоторое отражение-фу, так как свойство 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
ЗАКЛЮЧИТЕЛЬНОЕ РЕДАКТИРОВАНИЕ (обещаю ...). И вот способ избавиться от отражения: сначала создайте новый класс, чтобы предоставить свойство ViewState с пригодным для использования уровнем защиты, затем измените классы Code-Behind (.aspx.vb), чтобы они наследовали его вместо Web.UI. Страница, например:
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
Все еще немного взломано, но гораздо более приемлемо, чем использование отражения ...