Question:ViewState In VB.NET
ViewState在VB.NET中key区分大小写?可以观察下面的情况:结果很明显,ViewState那个比较输出true,而Session的输出值则是预期的2,cookie也是预期的覆盖.通过Reflector察看一下ViewState的set操作通过调用Add来执行ViewState("Customer_id") = 1 ViewState("Customer_Id") = 2 Response.Write(ViewState("Customer_ID")) Response.Write(ViewState("Customer_id") <> ViewState("Customer_Id"))Session("CustomerId") = 1 Session("customerid") = 2 Response.Write(Session("CustomeriD"))
不同的,Session或者Cookie的set操作都是通过类似dict(key) = value来实现set操作的,(HttpSessionState内部维护一个SessionDictionary,HttpCookie则是NameValueCollection).Public Sub set_Item(ByVal key As String, ByVal value As Object) Me.Add(key, value) End Sub
通过Framework的文档可以看到IDictionary的Add方法,备注说明Add方法将不会修改现有元素,而StateBag内部正是维护一个IDictionary的bag字段,并且本身也实现了IDictionary,这样看来似乎都合乎情理了,但是继续察看StateBag.Add(String,Object)的实现,我却又模糊了,这是Reflector反编译出来的代码:
从这段代码来看,难道是从IDictionary中通过key来读取value的操作区分大小写?不然item1不是Nothing就不可能调用bag.Add的方法,而是替换值,so,问题出在哪里呢?Public Function Add(ByVal key As String, ByVal value As Object) As StateItem If ((key Is Nothing) OrElse (key.Length Is 0)) Then Throw New ArgumentException(HttpRuntime.FormatResourceString("Key_Cannot_Be_Null")) End If Dim item1 As StateItem = TryCast(Me.bag(key),StateItem) If (item1 Is Nothing) Then If ((value Is Nothing) AndAlso Not Me.marked) Then Else item1 = New StateItem(value) Me.bag.Add(key, item1) End If Else If ((value Is Nothing) AndAlso Not Me.marked) Then Me.bag.Remove(key) Else item1.Value = value End If End If If ((item1 IsNot Nothing) AndAlso Me.marked) Then item1.IsDirty = True End If Return item1 End Function
posted on 2004-06-11 16:58:00 by mmkk 评论(15) 阅读(5118)