寺委书记

Good good study, day day up!

导航

谁缓存了我的数据?

Posted on 2007-07-11 18:04  MonkChen  阅读(359)  评论(1)    收藏  举报

这次依然是ObjectDataSource,问题是这样的:

         我的项目采用框架结构,页面上方和左侧各有菜单和TreeView导航,做成母版页,因母版页图片较多,为了减少切换页面造成重复的图片下载,使用了IFrame框架,页面运行的时候根据菜单或TreeView的链接动态加载内容页面,现在的内容页都是一些基础数据维护,都是ObjectDataSource+GridView+DetailsView来实现的,起初自己没有发现问题,是用户告知的,他修改或添加其中一个模块的数据后当场能显示更新后的内容,可是等点击左侧的导航链接切换到别的模块再往回切换的时候,发现显示的数据还是更新前的数据!

         我重复他描述的操作,结果确实如此,可是如果点击右键刷新页面的话,数据就显示为更新后的新数据!这时候可能有的人就要说是不是我的ObjectDataSource使用缓存了,我首先也怀疑了这点,但事实上我所有的ObjectDataSource都没有用缓存,查看web.config,也没有任何关于缓存的配置,我也没有任何缓存数据的代码。 

         由于我使用的DB是SQL Server,所以在切换模块的时候,我开着事件探查器进行跟踪,结果发现除了第一次打开这个模块会有Select操作,从别的模块再往回切换时,就根本没有任何Select操作了,也就是说显示的数据是从缓存里读出来的或者是ViewSate? 我把GridView的EnableViewSate设为False,问题依然存在,看来不是ViewSate的问题了。
 
         上网查资料,发现多数是开启了ObjectDataSource的Cache问题,没有找到任何关于这个问题的描述和解决方案。不过针对刷新能显示的现象,昨晚我通过对ObjectDataSource的Inserted,Updated, Deleted的事件添加 Response.Redirect(Request.Url.ToString()); 这行代码来解决。 问题虽然解决了,但我始终认为这不是最佳的方案,起码我还得为每个ObjectDataSource追加事件代码,而我想的是也许有个属性或者web.config配置一下就可以解决的。

         另外,通过测试我还发现,在地址栏里直接输入地址回车跟点击刷新按钮的效果是不一样的,   输入地址跟上述描述的点击导航链接的效果是一致的,而刷新确实是ie重新发送一个http请求的,从而得到新数据,从这点来看,我推测的结论是:如果是框架页面或直接在地址栏里面输入地址,如果ie发现该页面地址已经访问过,所以直接读取本地缓存;如果是刷新,则不管有没有访问过,都是重新向服务器发送请求然后得到数据。

         如果哪位读者有类似经历或有什么见解,敬请指点斧正!