.NET Framework SmartNavigation相关概念解析

开发 后端
.NET Framework SmartNavigation是一个Page中的属性。作为初学者来说,这篇文章介绍的内容对大家有一个非常大的帮助。

.NET Framework SmartNavigation这个Page属性很有意思,他在不改动(其实是改动很小)页面元素布局的情况下,居然可以模拟出非常平滑的“无刷新”页面,为什么这个“无刷新”要阔起来呢?其实他是刷新了的,而且用的也不是什么xmlhttp也不是xmldom技术,它是事实在在的Submit,可能这样是为了浏览器兼容性什么的来考虑的吧。 #t#

SmartNavigation的实现原理,其实和我们在动画绘制中使用的双缓冲技术及其相似。首先说一下他对普通页面的改造,他在普通的.aspx页面的返回结果中,加了两行代码,一个是IFrame,一个是JScript脚本:

  1. < IFRAME ID="__hifSmartNav" 
    NAME="__hifSmartNav" STYLE=
    "display:none"   
  2. src="/aspnet_client/system_web/
    1_1_4322/SmartNav.htm"
    > 
  3. < /IFRAME> 
  4. < script language="JScript" 
    src="/aspnet_client/system_web/
    1_1_4322/SmartNav.js"
    > 
  5. < /script> 

这中间的IFrame(__hifSmartNav)就相当于动画绘制中的实际绘图表面,在.NET Framework SmartNavigation中,他就是实际的Submit页面和数据接收页面。这一切都是SmartNav.js的杰作,SmartNav.js中使用了一个更有意思的技术,其实是老的不能再老的技术,用现代的话来说就是hook,说远点和Dos下修改中断向量有异曲同工之妙。它是怎么做的呢?其实除了显示输出,一切的操作都克隆到IFrame里去执行去了,因为IFrame对象,和Document对象有着最大的相似性,包括属性和事件等。

当我们执行enable了.NET Framework SmartNavigation的页面时,它首先被SmartNav.js引导,这个脚本中最关键的一句就是:var rc = window.__smartNav.attachForm();,他的作用就是把我们当前页面上的form,包装到一个叫__smartNav的类中,然后用这个类来操作一切navigate。
这是SmartNav.js中最关键最精彩的代码:

  1. if (snfm.__formAttached == 
    true) return true;   
  2. snfm.__formAttached = true;   
  3. snfm.attachEvent("onsubmit",
     window.__smartNav.init);   
  4. snfmsnfm._submit = snfm.submit;   
  5. snfm.submit = window.__
    smartNav.submit;   
  6. snfm.target = window.__
    smartNav.hifName; 

他完成了form的attach,同时hook了页面的submit事件,还在最后一句把__smartNav中form的target设定到了__hifSmartNav(这就是隐藏的那个IFrame)。如果不改变target,那么submit就把我们的当前form提交了。

.NET Framework SmartNavigation介绍到这儿已经就没有什么好说得了,提交是__hifSmartNav执行的,返回的数据也回到了这个IFrame中,剩下的就是把获得数据写回到我们本来的那个document中去,那些代码比较的复杂,处理的情况也挺多,连标题的更新都是考虑到了的,有兴趣就自己去读读罢。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-01-05 10:29:43

.NET Framew

2010-01-05 16:15:05

.NET Framew

2010-01-06 19:22:43

.NET Framew

2010-01-05 14:45:58

.NET Framew

2010-01-05 14:04:53

.NET Framew

2010-01-05 16:31:45

.NET Framew

2010-01-06 15:43:22

.Net Framew

2010-01-06 10:23:47

.NET Framew

2010-01-19 15:08:18

VB.NET对象成员

2009-08-25 18:16:02

.NET Framew.NET Framew

2010-01-05 18:09:07

.NET Framew

2010-01-06 16:45:42

.Net Framew

2010-01-06 17:02:28

.Net Framew

2009-12-15 15:55:43

Ruby模块

2009-08-26 14:16:17

C# FrameWor

2010-01-05 16:46:14

学习.NET Fram

2009-12-29 09:54:27

WPF文字布局

2009-12-28 16:20:50

WPF内嵌样式

2009-12-23 15:27:34

WPF图形系统

2009-12-28 15:18:29

WPF控件模型
点赞
收藏

51CTO技术栈公众号