首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

3.6 以编程方式控制ScriptManager

要通过编程方式控制页面上的ScriptManager,首先需要取得它在页面上的实例。ScriptManager控件是一个典型的Singleton模式的应用,每个ASP.NET AJAX页面上有且只能有一个ScriptManager的实例。ScriptManager类提供了一个静态的方法:GetCurrent(),该方法接受一个参数,即包含ScriptManager对象的页面的引用。这样,若希望在代码中得到当前页面上的ScriptManager对象,则可以使用下述代码:

ScriptManager theScriptManager = ScriptManager.GetCurrent(this);

当然,我们也可以直接使用ScriptManager的ID来对其进行引用。

ScriptManager提供一个名为RegisterAsyncPostBackControl()的方法,该方法接受一个类型为Control的参数。通过调用这个方法,我们可以告诉ScriptManager将页面中的该服务器端控件的传统整页回送模式改成Ajax的异步回送模式。例如,在前面一节的代码中,Page_Load()方法中有这样一条语句:

ScriptManager.GetCurrent(this).RegisterAsyncPostBackControl(btnInvokeBadMethod);

这样,若用户点击btnInvokeBadMethod按钮,将引发一次异步回送,而不是传统ASP.NET模型的整页回送。

注意,若代码中使用了RegisterAsyncPostBackControl()方法,则ScriptManager的EnablePartialRendering属性值一定要设置成true。

UpdatePanel中包围的内容以及其指定的作为触发器的控件均自动在ScriptManager中注册为采用异步方式进行回送,而无需我们手工干预。当然这是后话,关于UpdatePanel控件以及UpdatePanel的触发器,将在第4章中详细介绍。

我们同样可以以编程方式控制ScriptManager的EnablePartialRendering、Enable- ScriptGlobalization、EnablePageMethods和EnableScriptLocalization等属性。需要注意的是,修改这些属性值最好在Page的PreInit事件处理函数中进行。若晚于该阶段,ScriptManager将可能会抛出异常(取决于每个属性各自的设计,详情请参考ASP.NET AJAX在线帮助文档:http://ajax.asp.net/docs/)。下面的代码就在Page的PreInit中将EnablePartial- Rendering、EnableScriptGlobalization和EnableScriptLocalization属性值设置为true:

protected void Page_PreInit(object sender, EventArgs e)

{

    ScriptManager theScriptManager = ScriptManager.GetCurrent(this);

    theScriptManager.EnablePartialRendering = true;

    theScriptManager.EnableScriptGlobalization = true;

    theScriptManager.EnableScriptLocalization = true;

}

ScriptManager还提供了一个只读的布尔型属性:IsInAsyncPostBack。类似用传统ASP.NET模型中的Page.IsPostBack属性判断当前服务器执行的代码是否由回送引发,IsInAsyncPostBack可以用来判断当前服务器执行的代码是否是由异步回送所引发的。参见如下代码:

protected void Page_Load(object sender, EventArgs e)

{

    ScriptManager theScriptManager = ScriptManager.GetCurrent(this);

    if (theScriptManager.IsInAsyncPostBack)

    {

        // 仅在异步回送中执行的代码。

    }

}

ScriptManager的布尔型属性SupportsPartialRendering,用来判断当前的浏览器是否支持Ajax的局部更新功能,我们可以通过判断该属性来决定是在页面中启用Ajax,还是按照传统的方式进行整页回送:

protected void Page_Load(object sender, EventArgs e)

{

    ScriptManager theScriptManager = ScriptManager.GetCurrent(this);

    if (theScriptManager.SupportsPartialRendering)

    {

        // 支持Ajax的浏览器,可以使用Ajax的高级功能。

    }

    else

    {

        // 不支持Ajax的浏览器,我们还是要按照传统的方式处理页面。

    }

}

ScriptManager的布尔型属性IsDebuggingEnabled,用来判断当前的请求是否运行于Debug模式。如下代码即在Page_Load()方法中根据该属性值设定了ScriptManager的ScriptPath属性,将引用的脚本指向了不同的目录:

protected void Page_Load(object sender, EventArgs e)

{

    ScriptManager theScriptManager = ScriptManager.GetCurrent(this);

    string scriptPathPrefix = theScriptManager.IsDebuggingEnabled ? "Debug/" : "Release/";

    foreach (ScriptReference scriptRef in theScriptManager.Scripts)

    {

        if (scriptRef.Path != string.Empty)

        {

            scriptRef.Path = scriptPathPrefix + scriptRef.Path;

        }

    }

}

ScriptManager提供的Scripts和Services两个属性将分别返回当前ScriptManager对象中引用的脚本文件和Web Service的集合。这样,我们即可在程序运行时通过维护这两个集合而动态地对页面中引用的脚本或Web Service代理进行维护。例如,下面的代码就在ScriptManager中添加了一个客户端脚本文件的引用:

ScriptManager theScriptManager = ScriptManager.GetCurrent(this);

theScriptManager.Scripts.Add(new ScriptReference("MyControl.js"));

ScriptManager的作用远不止这些,它还提供了大量的用于注册页面中其他ASP.NET AJAX控件、脚本块以及数据的方法,均以“Register”开头。这些方法将广泛用于自定义ASP.NET AJAX服务器端控件开发中,图3-20即显示了Visual Studio为这部分接口提供的智能感知界面。这些方法将在第Ⅲ卷中详细介绍。

图3-20  ScriptManager提供的“Register”开头的方法

图3-21显示了ScriptManager控件提供的静态的以“Register”开头的一系列方法,这些方法同样将广泛用于注册页面中其他ASP.NET AJAX控件、脚本以及数据的方法中。

图3-21  ScriptManager提供的“Register”开头的静态方法

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论