结果很明显,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
打印 | 张贴于 2004-06-11 16:58:00 | Tag:DotNet
留言反馈
PS.现在Reflector反编译Visual Basic可读性还真是不错,特别是加入Visual Basic 2005的TryCast和IsNot运算符以后。
我会再认真看一下,虚心求教.我这样问问题,开心不会批我吧-_!!
virtual protected bool ViewStateIgnoresCase{get;}
返回false。
当这个方法被重写返回true的话,那么Control.ViewState就是不区分大小写的。
StateBag中的dict是HybridDictionary,它支持区分/不区分大小写两种模式
(所以ViewState默认不区分大小写)
SessionDictionary 继承 NameObjectCollectionBase
默认是是不区分大小写的。
象jjx所说,通过重载ViewStateIgnoresCase就可以不区分大小写,因此继承IDictionary接口,健/值结构,对于健使用字符串,字符串当然要区分大小写的结论似乎不太正确:)
我太关注于Add方法了,以至于连ctor都没有注意看,至于ViewStateIgnoresCase只能说是我水平有限,不知道-_!!
I got it,thanks jjx.
再看Control 类,有个
protected virutal bool ViewStateIgnoresCase
{
get (return false;}
}
默认说明是大小写敏感的,覆盖它就行