ViewState在VB.NET中key区分大小写?可以观察下面的情况:
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"))
结果很明显,ViewState那个比较输出true,而Session的输出值则是预期的2,cookie也是预期的覆盖.通过Reflector察看一下ViewState的set操作通过调用Add来执行

StateBag.Add)
Public Sub set_Item(ByVal key As String, ByVal value As Object)
Me.Add(key, value)
End Sub
不同的,Session或者Cookie的set操作都是通过类似dict(key) = value来实现set操作的,(HttpSessionState内部维护一个SessionDictionary,HttpCookie则是NameValueCollection).
通过Framework的文档可以看到IDictionary的Add方法,备注说明Add方法将不会修改现有元素,而StateBag内部正是维护一个IDictionary的bag字段,并且本身也实现了IDictionary,这样看来似乎都合乎情理了,但是继续察看StateBag.Add(String,Object)的实现,我却又模糊了,这是Reflector反编译出来的代码:
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
从这段代码来看,难道是从IDictionary中通过key来读取value的操作区分大小写?不然item1不是Nothing就不可能调用bag.Add的方法,而是替换值,so,问题出在哪里呢?