No, no hay un equivalente directo, pero si está utilizando v3.5 del Framework, puede agregar esta funcionalidad bastante fácilmente usando un método de extensión. Por ejemplo:
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
Luego, en sus páginas ASP.NET, primero ponga sus extensiones dentro del alcance, e.g:
Imports WebApplication1.Extensions
... y luego usarlo como sus controles deseada: editar
TextBox1.SetTag("Test")
Label1.Text = TextBox1.GetTag
después: y si realmente, realmente no desea almacenar sus etiquetas en el objeto Session, es posible rellenarlos en su Viewstate en su lugar. Esto significará, por supuesto, que sus etiquetas serán expuestas en el marcado de página enviado al usuario (aunque en forma ofuscada), y, desafortunadamente, que se requiere algún reflejo-fu, ya que la propiedad ViewState de una página está marcada como 'protegido' por alguna razón.
Por lo tanto, este código debe ser considerado más o menos para fines de entretenimiento, a menos que realmente como a levantar las cejas durante las revisiones de código:
<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
edición final (prometo ...). Y aquí hay una manera de deshacerse de la reflexión: primero, cree una nueva clase para exponer la propiedad ViewState con un nivel de protección utilizable, luego cambie sus clases de código subyacente (.aspx.vb) para heredar eso en lugar de Web.UI. página, por ejemplo:
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
Ahora, en su módulo de extensiones, se puede acceder a este inmueble recién definida como:
Private Function ViewState() As Web.UI.StateBag
Return DirectCast(HttpContext.Current.Handler, PageEx).ViewStateEx
End Function
Todavía un poco de un truco, pero mucho más aceptable que el uso de la reflexión ..
Wow. Eso es MUY cercano a lo que estaba pidiendo y asumiendo que no había forma de hacerlo. No estoy muy contento con la sesión, pero definitivamente tendré que aprender esta cosa de Extensiones (estoy usando v2.0, pero AHORA voy a migrar :-D) –
¡Eso es bastante astuto, en realidad! –
¡Agradable! ¡Me encantaría darte más puntos por eso! Esperemos que implementen el karma por el que están hablando ... –