13.2 ScriptManager控件
ScriptManager控件是实现页面异步更新的基础。默认情况下,ScriptManager控件会向页面注册Microsoft Ajax Library的脚本。这将使客户端脚本能够使用类型系统扩展,并支持部分页呈现和Web服务调用这样的功能。本节介绍ScriptManager控件的概念及其应用。
13.2.1 ScriptManager简介
ASP.NET的Ajax功能只有在页面使用ScriptManager控件的基础上才能够实现,ScriptManager控件有如下几个特点。
(1)它是脚本控制器,是asp.net.Ajax存在的基础,是所有的Ajax控件的基础。
(2)一个页面只允许有一个ScriptManager,并且放在其他的Ajax控件的前面。
(3)ScriptManager掌管着客户端Ajax页的多个脚本,并在页面中注册Ajax类库,用来实现页面的局部更新和对Web服务的调用。
Ajax可向JavaScript添加类型系统扩展,以提供命名空间、继承、接口、枚举、映射以及字符串和数组的Helper函数。这些扩展可以在客户端脚本中提供与.NET Framework的功能类似的功能。
利用这些扩展,可按一种结构化方式编写支持Ajax的ASP.NET应用程序,这不仅能提高可维护性,还使添加功能和功能分层的操作更容易。向ASP.NET网页添加ScriptManager控件自动包括类型系统扩展,可以在客户端脚本中使用该库。ScripManager控件的基本属性如表13-1所示。
表13-1 ScriptManager控件的基本属性
虽然Ajax功能需要借助ScriptManager控件才能够起作用,但ScriptManager控件是不在页面中显示的,而是控制着页面中的UpdatePanel控件来显示。这样的关系相当于数据源控件与数据显示控件,数据源控件能够获取数据但不显示,而数据显示控件能够显示数据源中的数据。当页包含一个或多个UpdatePanel控件时,ScriptManager控件将管理浏览器中的部分页呈现,与页生命周期进行交互,更新UpdatePanel控件内的区域。
13.2.2 ScriptManager应用
ScriptManager控件是ASP.NET中Ajax功能的中心。ScriptManager控件管理一个页面上的所有Ajax资源。其中包括将Ajax脚本下载到浏览器和协调通过使用UpdatePanel控件启用的部分页面更新。此外,通过ScriptManager控件还能执行以下操作。
(1)注册与部分页面更新兼容的脚本。为了管理脚本与核心库之间的依赖项,将在加载Ajax脚本之后加载注册的所有脚本。
(2)指定是发布还是调试发送到浏览器的脚本。
(3)通过向ScriptManager控件注册Web服务,提供从脚本访问Web服务方法的权限。
(4)通过向ScriptManager控件注册ASP.NET身份验证、角色和配置文件应用程序服务,提供从客户端脚本访问这些服务的权限。
(5)在浏览器中以区域性特定的形式显示脚本的Date、Number和String函数。
(6)使用ScriptReference控件的ResourceUICultures属性来访问嵌入式脚本文件或独立脚本文件的本地化资源。
(7)向ScriptManager控件注册可实现IExtenderControl或IScriptControl接口的服务器控件,以便呈现客户端组件和行为所需的脚本。
一个网页只能包含一个ScriptManager控件,该控件既可以直接位于页面中,也可以间接位于嵌套组件或父组件内部。下面详细介绍ScriptManager控件的应用。
1.脚本的管理和注册
ScriptManager控件控制脚本的使用,可以直接通过控件的集合,也可通过注册方法,再指定脚本。
ScriptManager控件的Scripts集合中针对浏览器中可用的每个脚本包含一个ScriptReference对象。可以以声明方式或编程方式指定脚本。
ScriptManager控件公开了一些注册方法,以编程方式管理客户端脚本和隐藏字段。当为支持部分页更新的脚本或隐藏字段注册时,必须调用ScriptManager控件的注册方法。
页上使用ScriptManager控件注册的脚本以及所有事件处理脚本,必须位于页上的form元素内。否则,将不会注册或执行脚本。
通过ScriptManager控件可注册随后将作为页面一部分呈现的脚本。ScriptManager控件注册方法可以细分为以下三种类别。
(1)保证维护Ajax上脚本依赖项的注册方法。
(2)不依赖Ajax但与UpdatePanel控件兼容的注册方法。
(3)支持与UpdatePanel控件协作的注册方法。
注册依赖Ajax的脚本可以使用表13-2中的方法,以保证维护Ajax上所有依赖项的方式注册脚本文件。
表13-2 维护Ajax上所有依赖项的注册方法
方法名称 | 说明 |
RegisterScriptControl<TScript Control> | 注册可实现用来定义Sys.Component客户端对象的IScriptControl接口的服务器控件。ScriptManager控件呈现支持该客户端对象的脚本 |
RegisterExtenderControl<TExt enderControl> | 注册可实现用来定义Sys.UI.Behavior客户端对象的IExtenderControl接口的服务器控件。ScriptManager 控件呈现支持该客户端对象的脚本 |
可以使用表13-3中的方法注册不依赖Ajax但与UpdatePanel控件兼容的脚本文件。这些方法与ClientScriptManager控件的类似方法相对应。如果为便于在UpdatePanel控件中使用而呈现脚本,则应确保调用ScriptManager控件的方法。
表13-3 与UpdatePanel控件兼容的脚本的注册方法
在注册方法时,可为该脚本指定类型/键对。如果已注册了一个包含相同类型/键对的脚本,则不会注册新的脚本。同样,如果所注册脚本的类型/资源名称对已存在,则不会再添加引用该资源的script元素。如果注册一个以前注册过的expando特性,则会引发异常。允许重复注册数组值。
在调用RegisterClientScriptInclude()或RegisterClientScriptResource()方法时,应避免注册执行内联函数的脚本。相反,应注册包含函数定义(如事件处理程序)或应用程序的自定义类定义的脚本。
2.Web服务应用
若要注册想要从支持Ajax的ASP.NET页调用的Web服务,可以通过将该Web服务添加到ScriptManager控件的Services集合来注册它。ASP.NET Ajax Framework为Services集合中的每个ServiceReference对象生成一个客户端代理对象。这些代理类及其强类型成员将简化从客户端脚本使用Web服务的过程。
可以以编程方式将ServiceReference对象添加到Services集合,以便在运行时为Web服务注册。
通过创建一个ServiceReference对象,然后将其添加到ScriptManager控件的Services集合中,可以注册一个要从客户端脚本调用的Web服务。ASP.NET可为Services集合中的每个ServiceReference对象生成一个客户端代理对象。可通过编程方式将ServiceReference对象添加到Services集合中,以便在运行时注册Web服务。
ScriptManager控件可在呈现页面中生成指向适当的本地化脚本文件(嵌入程序集中的脚本文件或独立脚本文件)的引用。
在将EnableScriptLocalization属性设置为true时,ScriptManager控件会检索当前区域中诸如本地化字符串这样的本地化资源(如果存在)。ScriptManager控件可为使用本地化资源提供下列功能。
1)嵌入到程序集中的脚本文件
ScriptManager控件可确定将哪个区域性特定的或回退区域性脚本文件发送到浏览器。为此,它会使用区域性特定的NeutralResourcesLanguageAttribute程序集特性、打包在程序集中的资源以及浏览器的UI区域性(如果有)。
2)独立脚本文件
ScriptManager控件可使用ScriptReference对象的ResourceUICultures属性来定义受支持的UI区域性的列表。
3)在调试模式中
ScriptManager控件尝试呈现包含调试信息的区域性特定的脚本文件。例如,如果页面处于调试模式且当前区域性设置为en-MX,则该控件会呈现一个其名称如scriptname.en-MX.debug.js这样的脚本文件(如果该文件存在)。如果该文件不存在,则呈现适当回退区域性的调试文件。
3.从客户端脚本使用身份验证、配置文件和角色服务
Ajax包含用于从JavaScript直接调用ASP.NET 2.0 Forms身份验证、配置文件和角色应用程序服务的代理类。如果要使用自定义身份验证服务,则可通过使用ScriptManager控件来为该服务注册。
4.添加特定于嵌套的组件的脚本和服务
只能向页添加ScriptManager控件的一个实例。该页可以直接包含该控件,也可以将其间接包含在嵌套的组件中,如用户控件、母版页的内容页或嵌套的母版页。如果页已包含ScriptManager控件,但嵌套的组件或父组件需要ScriptManager控件的其他功能,则该组件可以包含ScriptManagerProxy控件。
使用ScriptManagerProxy控件,可在母版页或宿主页已包含ScriptManager控件的情况下,将脚本和服务添加到内容页和用户控件中。
在使用ScriptManagerProxy控件时,可以将脚本和服务添加到ScriptManager控件所定义的脚本和服务集合。如果不希望在包含特定ScriptManager控件的每一页上都包含特定的脚本和服务,则可以将这些脚本和服务从ScriptManager控件中移除。可以通过改用ScriptManagerProxy控件,将这些脚本和服务添加到各页中。
5.部分页面呈现
ScriptManager控件的EnablePartialRendering属性确定某个页是否参与部分页更新。默认情况下,EnablePartialRendering属性为true。因此,默认情况下,当向页添加ScriptManager控件时,将启用部分页呈现。
ASP.NET页面支持部分页面呈现的能力受到以下因素的控制。
(1)ScriptManager控件的EnablePartialRendering属性必须为true(默认值)。
(2)页面上必须至少有一个UpdatePanel控件。
(3)SupportsPartialRendering属性必须为true(默认值)。如果没有显式设置SupportsPartialRendering属性,则其值依浏览器功能而定。
可以在发生页面的Init事件期间或之前,在运行时重写EnablePartialRendering属性的值。如果尝试在发生页面的Init事件后更改此属性,则会引发InvalidOperationException异常。
当部分页面呈现受支持时,ScriptManager控件会呈现脚本以启用异步回发和部分页面更新。可使用UpdatePanel控件来指定要更新的页面区域。ScriptManager控件会处理异步回发,并且只刷新必须要更新的页面区域。
通常将ScriptManager控件与母版页、用户控件及其他子组件一起使用。
一个页面在其层次结构中只能包含一个ScriptManager控件。若要在父页面已具有ScriptManager控件时为嵌套页面、用户控件或组件注册服务和脚本,则需要使用ScriptManagerProxy控件。
共有条评论 网友评论