对于Asp.Net 2.0中脚本资源的研究(1)
2007-07-07 15:53
786 查看
对于Asp.Net 2.0中WebResource的研究(1)
Author: Truly
对于Asp.Net 2.0中,提供了很多脚本资源文件,以嵌入资源包含在程序集中:
WebForms.js
WebUIValidation.js
SmartNav.htm
SmartNav.js
Menu.js
MicrosoftAjaxWebForms.js
MicrosoftAjax.js
等
当我们改变Page的属性或增加某些服务器控件之后,页面会自动将这些资源的引用地址注册到页面上。
例如我们启用了MaintainScrollPositionOnPostback之后,那么页面将自动注册类似下面的语句:
<script src="/WebResource.axd?d=ZnL1CDIew0DLWTT0rctn7A2&t=633118963218359345" type="text/javascript"></script>
这一工作是由System.Web.Handlers.AssemblyResourceLoader的GetWebResourceUrl方法完成的。
需要注意的是这一方法像其它许多方法一样,出于某些目的,MS将其定义为internal方法,我们知道,标记为 internal 的方法只能被相同程序集中的其他类调用。因此,我们无法手动注册这一脚本资源引用。
幸运的是,大多数情况我们并不需要这么做。
但是由于这些资源中定义了很多webform中常用的一些脚本函数,有时候也许你希望能够利用这些函数,那么如何能得到这一脚本引用或者将其注册到页面上呢?
这里首先介绍一个调用.net框架类库中的一些internal方法的技巧,实质是利用反射:
访问.net类的private或internal成员
Type t = typeof(System.Web.Handlers.AssemblyResourceLoader);
object[] args = new object[] { typeof(Page),"WebForms.js", true };
BindingFlags bindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod;
string result = (string)(t.InvokeMember("GetWebResourceUrl", bindingFlags, null, null, args));
Page.ClientScript.RegisterStartupScript(typeof(_Default),"abc", String.Format("<script src=\"{0}\" type=\"text/javascript\"></script>", result));
上面的方式是直接获取正确的资源文件,并将其注册到页面上。
下面介绍另外一种方法,就是直接利用反射调用Page类的RegisterWebFormsScript方法:
Type t = typeof(System.Web.UI.Page);
BindingFlags bindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance;
t.InvokeMember("RegisterWebFormsScript", bindingFlags, null, this, null);
大家可以仔细比较2者在运行时的区别,从呈现层面来讲,前者比较灵活,但是可能重复注册脚本引用,后面的方法则不会出现这一情况。事实上,对于前者,Page类中有一个私有变量记录了页面是否已经注册过脚本引用,该字段名称是_fWebFormsScriptRendered,可以根据此变量检测页面上是否已经注册这一脚本引用
在Asp.Net2.0中还有另外一种方法更加简便:
this.Page.ClientScript.RegisterClientScriptResource(typeof(System.Web.UI.Page), "WebForms.js");
而另外一条语句也是否有用,通常用作获取自定义的嵌入文件引用:
string includeLocation =
Page.ClientScript.GetWebResourceUrl(this.GetType(), "myStyleSheet.css");
这里我们可以使用:
string includeLocation =
Page.ClientScript.GetWebResourceUrl(typeof(Page), "WebForms.js");
补充说明一下资源引用的URL格式:
WebResource.axd?d=加密后的标识&t=时间戳
思考一,是否可以使用固定的src来调用资源呢,答案是否定的。
思考二,是否可以在html中使用呢,答案是肯定的,只要站点是放在asp.net2.0环境中的,那么通常都支持.axd后缀的文件请求,对于WebResource.axd这样的请求将会转交System.Web.Handlers.AssemblyResourceLoader进行处理。
思考三,性能,未混淆的。
思考四,脚本的重用。
那么WebForm.js都包含了什么方法呢,我整理了一下,方法列表如下:
WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit)
WebForm_DoPostBackWithOptions(options)
WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync)
WebForm_CallbackComplete()
WebForm_ExecuteCallback(callbackObject)
WebForm_FillFirstAvailableSlot(array, element)
WebForm_InitCallback()
WebForm_InitCallbackAddField(name, value)
WebForm_EncodeCallback(parameter)
WebForm_ReEnableControls()
WebForm_ReDisableControls()
WebForm_FireDefaultButton(event, target)
WebForm_GetScrollX()
WebForm_GetScrollY()
WebForm_SaveScrollPositionSubmit()
WebForm_SaveScrollPositionOnSubmit()
WebForm_RestoreScrollPosition()
WebForm_TextBoxKeyHandler(event)
WebForm_AppendToClassName(element, className)
WebForm_RemoveClassName(element, className)
WebForm_GetElementById(elementId)
WebForm_GetElementByTagName(element, tagName)
WebForm_GetElementsByTagName(element, tagName)
WebForm_GetElementDir(element)
WebForm_GetElementPosition(element)
WebForm_GetParentByTagName(element, tagName)
WebForm_SetElementHeight(element, height)
WebForm_SetElementWidth(element, width)
WebForm_SetElementX(element, x)
WebForm_SetElementY(element, y)
字段:
__disabledControlArray
已禁用的控件数组
__enabledControlArray 依赖js外部
Author: Truly
对于Asp.Net 2.0中,提供了很多脚本资源文件,以嵌入资源包含在程序集中:
WebForms.js
WebUIValidation.js
SmartNav.htm
SmartNav.js
Menu.js
MicrosoftAjaxWebForms.js
MicrosoftAjax.js
等
当我们改变Page的属性或增加某些服务器控件之后,页面会自动将这些资源的引用地址注册到页面上。
例如我们启用了MaintainScrollPositionOnPostback之后,那么页面将自动注册类似下面的语句:
<script src="/WebResource.axd?d=ZnL1CDIew0DLWTT0rctn7A2&t=633118963218359345" type="text/javascript"></script>
这一工作是由System.Web.Handlers.AssemblyResourceLoader的GetWebResourceUrl方法完成的。
需要注意的是这一方法像其它许多方法一样,出于某些目的,MS将其定义为internal方法,我们知道,标记为 internal 的方法只能被相同程序集中的其他类调用。因此,我们无法手动注册这一脚本资源引用。
幸运的是,大多数情况我们并不需要这么做。
但是由于这些资源中定义了很多webform中常用的一些脚本函数,有时候也许你希望能够利用这些函数,那么如何能得到这一脚本引用或者将其注册到页面上呢?
这里首先介绍一个调用.net框架类库中的一些internal方法的技巧,实质是利用反射:
访问.net类的private或internal成员
Type t = typeof(System.Web.Handlers.AssemblyResourceLoader);
object[] args = new object[] { typeof(Page),"WebForms.js", true };
BindingFlags bindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod;
string result = (string)(t.InvokeMember("GetWebResourceUrl", bindingFlags, null, null, args));
Page.ClientScript.RegisterStartupScript(typeof(_Default),"abc", String.Format("<script src=\"{0}\" type=\"text/javascript\"></script>", result));
上面的方式是直接获取正确的资源文件,并将其注册到页面上。
下面介绍另外一种方法,就是直接利用反射调用Page类的RegisterWebFormsScript方法:
Type t = typeof(System.Web.UI.Page);
BindingFlags bindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod | BindingFlags.Instance;
t.InvokeMember("RegisterWebFormsScript", bindingFlags, null, this, null);
大家可以仔细比较2者在运行时的区别,从呈现层面来讲,前者比较灵活,但是可能重复注册脚本引用,后面的方法则不会出现这一情况。事实上,对于前者,Page类中有一个私有变量记录了页面是否已经注册过脚本引用,该字段名称是_fWebFormsScriptRendered,可以根据此变量检测页面上是否已经注册这一脚本引用
在Asp.Net2.0中还有另外一种方法更加简便:
this.Page.ClientScript.RegisterClientScriptResource(typeof(System.Web.UI.Page), "WebForms.js");
而另外一条语句也是否有用,通常用作获取自定义的嵌入文件引用:
string includeLocation =
Page.ClientScript.GetWebResourceUrl(this.GetType(), "myStyleSheet.css");
这里我们可以使用:
string includeLocation =
Page.ClientScript.GetWebResourceUrl(typeof(Page), "WebForms.js");
补充说明一下资源引用的URL格式:
WebResource.axd?d=加密后的标识&t=时间戳
思考一,是否可以使用固定的src来调用资源呢,答案是否定的。
思考二,是否可以在html中使用呢,答案是肯定的,只要站点是放在asp.net2.0环境中的,那么通常都支持.axd后缀的文件请求,对于WebResource.axd这样的请求将会转交System.Web.Handlers.AssemblyResourceLoader进行处理。
思考三,性能,未混淆的。
思考四,脚本的重用。
那么WebForm.js都包含了什么方法呢,我整理了一下,方法列表如下:
WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit)
WebForm_DoPostBackWithOptions(options)
WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync)
WebForm_CallbackComplete()
WebForm_ExecuteCallback(callbackObject)
WebForm_FillFirstAvailableSlot(array, element)
WebForm_InitCallback()
WebForm_InitCallbackAddField(name, value)
WebForm_EncodeCallback(parameter)
WebForm_ReEnableControls()
WebForm_ReDisableControls()
WebForm_FireDefaultButton(event, target)
WebForm_GetScrollX()
WebForm_GetScrollY()
WebForm_SaveScrollPositionSubmit()
WebForm_SaveScrollPositionOnSubmit()
WebForm_RestoreScrollPosition()
WebForm_TextBoxKeyHandler(event)
WebForm_AppendToClassName(element, className)
WebForm_RemoveClassName(element, className)
WebForm_GetElementById(elementId)
WebForm_GetElementByTagName(element, tagName)
WebForm_GetElementsByTagName(element, tagName)
WebForm_GetElementDir(element)
WebForm_GetElementPosition(element)
WebForm_GetParentByTagName(element, tagName)
WebForm_SetElementHeight(element, height)
WebForm_SetElementWidth(element, width)
WebForm_SetElementX(element, x)
WebForm_SetElementY(element, y)
字段:
__disabledControlArray
已禁用的控件数组
__enabledControlArray 依赖js外部
函数名 | 说明 |
WebForm_PostBackOptions(eventTarget, eventArgument, validation, validationGroup, actionUrl, trackFocus, clientSubmit) | 将指定的回传参数作为属性添加到this对象中。 |
WebForm_DoPostBackWithOptions(options) | 根据WebForm_PostBackOptions方法生成的数据信息 设置actionUrl和回传前的最后焦点控件以及事件参数。 |
WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) | 回调函数 |
WebForm_CallbackComplete() | 回调完成处理函数 |
WebForm_ExecuteCallback(callbackObject) | 执行回调 |
WebForm_FillFirstAvailableSlot(array, element) | 将指定对象添加到指定数组中第一个空位置。 |
WebForm_InitCallback() | 初始化回调,将所有的input, select textarea等控件的数据使用WebForm_InitCallbackAddField方法添加到相应的数组和变量中。 |
WebForm_InitCallbackAddField(name, value) | 创建一个自定义对象包含传入的键值属性增加到__theFormPostCollection数组中 并且以“name=value&”的字符串形式添加到__theFormPostCollection变量中 |
WebForm_EncodeCallback(parameter) | 对回调参数进行URI编码,依赖于其他js类库的encodeURIComponent方法。 |
WebForm_ReEnableControls() | 找到__enabledControlArray数组中所有已禁用的控件,启用它们并将其记录到__disabledControlArray中。 |
WebForm_ReDisableControls() | 把__disabledControlArray保存的控件重新禁用 |
WebForm_FireDefaultButton(event, target) | 当在页面除textarea外区域中按下回车按钮时,激发指定的默认按钮。target是默认按钮的客户端id。 |
WebForm_GetScrollX() | 获取当前页面的X滚动轴坐标(document.body.scrollLeft) |
WebForm_GetScrollY() | 获取当前页面的Y滚动轴坐标(document.body.scrollTop) |
WebForm_SaveScrollPositionSubmit() | 在提交表单时保存滚动轴坐标,下面3个函数均利用了表单中的__SCROLLPOSITIONX隐藏域。 |
WebForm_SaveScrollPositionOnSubmit() | 与上面方法不同的是,这个方法仅在类ie浏览器中有效。 |
WebForm_RestoreScrollPosition() | 恢复提交表单前保存的滚动条位置 |
WebForm_TextBoxKeyHandler(event) | 可用来设置指定textbox不响应回车事件,例如:<input onkeydown='WebForm_TextBoxKeyHandler(event)' |
WebForm_AppendToClassName(element, className) | 为指定元素增加指定样式 |
WebForm_RemoveClassName(element, className) | 删除指定元素的指定样式 |
WebForm_GetElementById(elementId) | 获取指定id的元素 |
WebForm_GetElementByTagName(element, tagName) | 获取指定元素中指定标记的首个元素 |
WebForm_GetElementsByTagName(element, tagName) | 获取指定元素中指定标记的元素集合 |
WebForm_GetElementDir(element) | 获取指定元素的dir属性 |
WebForm_GetElementPosition(element) | 获取指定元素的位置等信息 返回类型:自定义对象( var result = new Object(); result.x = 0; result.y = 0; result.width = 0; result.height = 0;) |
WebForm_GetParentByTagName(element, tagName) | 取得某元素最近的tagName为指定标记的父节点。 |
WebForm_SetElementHeight(element, height) | 设置某元素的高度 |
WebForm_SetElementWidth(element, width) | 设置某元素的宽度 |
WebForm_SetElementX(element, x) | 设置某元素的y坐标 |
WebForm_SetElementY(element, y) | 设置某元素的y坐标 |
相关文章推荐
- 对于Asp.Net 2.0中脚本资源的研究(1)
- 对于Asp.Net 2.0中脚本资源的研究(2)
- 对于Asp.Net 2.0中脚本资源的研究(转)
- ASP.NET 2.0 中的客户端脚本
- ASP.net 2.0 中 WebResource.axd 管理Image,JS,CSS资源
- [转]ASP.NET 2.0 中的资源与本地化
- asp.net web api 2.0 实现跨域资源共享
- ASP.NET 2.0 中的客户端脚本
- ASP.NET MVC:怎么组合脚本和其他资源
- ASP.NET 2.0中客户端脚本总结
- asp.net 2.0 自定义控件中的使用嵌入资源
- ASP.NET 2.0中客户端脚本总结
- ASP.NET 2.0中客户端脚本总结
- ASP.NET 2.0页面生存周期的研究
- asp.net 2.0学习资源
- Script Callback in ASP.NET 2.0 (脚本回调)
- ASP.NET 2.0 本地化技术之研究(二)
- Asp.net 2.0 脚本回调技术
- ASP.NET 2.0 Beta 1研究总结
- ASP.NET 2.0 中的客户端脚本