いいえ、直接同等のものはありませんが、フレームワークの 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
次に、ASP.NET ページで、まず次のように拡張機能をスコープに含めます。
Imports WebApplication1.Extensions
...そして、必要に応じてコントロールを使用します。
TextBox1.SetTag("Test")
Label1.Text = TextBox1.GetTag
LATER EDIT:そして、本当にタグをSessionオブジェクトに保存したくない場合は、代わりにそれらをViewstateに詰め込むことができます。これはもちろん、ユーザーに送信されるページ マークアップでタグが公開されることを意味し (難読化された形式ではありますが)、残念ながら、Page の 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 プロパティを公開する新しいクラスを作成してから、コード ビハインド (.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
まだ少しハックですが、リフレクションを使用するよりもはるかに受け入れられます...