mmkk's Weblog

dotnet and web skills
随笔 - 25, 评论 - 181, 引用 - 79

导航

工具

关于

标签

每月存档

广告



访客

 
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,问题出在哪里呢?

相关文章

打印 | 张贴于 2004-06-11 16:58:00 | Tag:DotNet

留言反馈

#re:Question:ViewState In VB.NET 编辑
Question:ViewState In VB.NETooeess
2005-06-16 14:36:00 | [匿名用户:气味检测仪]
#re:Question:ViewState In VB.NET 编辑
^_^,Pretty Good!
2005-04-16 05:45:00 | [匿名用户:邵氏硬度计]
#re:Question:ViewState In VB.NET 编辑
^_^,Pretty Good!
2005-04-10 20:13:00 | [匿名用户:流变仪]
#re: Question:ViewState In VB.NET 编辑
其实在cookies和session里的keys就区分大小写了。
2004-12-16 23:24:00 | [匿名用户:洛林(renaski)]
#回复: Question:ViewState In VB.NET 编辑
VB.NET不区分大小写的只是在关键字和标识符上,对字符串中大小写的判断对各种语言来说应该有同样的原理。
PS.现在Reflector反编译Visual Basic可读性还真是不错,特别是加入Visual Basic 2005的TryCast和IsNot运算符以后。
2004-06-12 11:31:00 | [匿名用户:Ninputer]
#回复: Question:ViewState In VB.NET 编辑
ok,thanks lostinet,thanks gene.really help.
我会再认真看一下,虚心求教.我这样问问题,开心不会批我吧-_!!
2004-06-11 18:02:00 | [匿名用户:mmkk]
#回复: Question:ViewState In VB.NET 编辑
继承IDictionary接口,健/值结构,对于健使用字符串,字符串当然要区分大小,这个没有错误,在设置了那个属性,在读入的时候,使用的重载函数不一样,而不是说SateBag这种结构不区分大小写了
2004-06-11 17:51:00 | [匿名用户:gene]
#回复: Question:ViewState In VB.NET 编辑
一个控件有一个的属性:
virtual protected bool ViewStateIgnoresCase{get;}
返回false。
当这个方法被重写返回true的话,那么Control.ViewState就是不区分大小写的。
StateBag中的dict是HybridDictionary,它支持区分/不区分大小写两种模式
(所以ViewState默认不区分大小写)

SessionDictionary 继承 NameObjectCollectionBase
默认是是不区分大小写的。

2004-06-11 17:45:00 | [匿名用户:Lostinet]
#回复: Question:ViewState In VB.NET 编辑
(所以ViewState默认区分大小写)
2004-06-11 17:45:00 | [匿名用户:Lostinet]
#回复: Question:ViewState In VB.NET 编辑
to gene:
象jjx所说,通过重载ViewStateIgnoresCase就可以不区分大小写,因此继承IDictionary接口,健/值结构,对于健使用字符串,字符串当然要区分大小写的结论似乎不太正确:)
我太关注于Add方法了,以至于连ctor都没有注意看,至于ViewStateIgnoresCase只能说是我水平有限,不知道-_!!
2004-06-11 17:37:00 | [匿名用户:mmkk]
#回复: Question:ViewState In VB.NET 编辑
我不会VB.net,但是我想这和VB.net应该没有什么关系吧,StateBag继承于IDictionary接口,健/值结构,对于健使用字符串,字符串当然要区分大小写了
2004-06-11 17:28:00 | [匿名用户:gene]
#回复: Question:ViewState In VB.NET 编辑
yeah...
I got it,thanks jjx.
2004-06-11 17:28:00 | [匿名用户:mmkk]
#回复: Question:ViewState In VB.NET 编辑
StateBag 本身就有两个构造函数,看看,第二个

再看Control 类,有个
protected virutal bool ViewStateIgnoresCase
{
get (return false;}
}

默认说明是大小写敏感的,覆盖它就行
2004-06-11 17:15:00 | [匿名用户:jjx]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode MVC Blogger System