您的位置:首页 > 编程语言 > ASP

ASP.NET AJAX入门系列(7):使用客户端脚本对UpdateProgress编程

2015-06-27 00:20 609 查看

在本篇文章中,我们将通过编写JavaScript来使用客户端行为扩展UpdateProgress控件,客户端代码将使用ASP.NET AJAX Library中的PageRequestManager,在UpdateProgress控件中,将添加一个Button,来允许用户取消异步更新,并且使用客户端脚本来显示或者隐藏进度信息。

主要内容

1.通过客户端脚本取消异步更新

2.通过客户端脚本显示或者隐藏进度信息

一.通过客户端脚本取消异步更新

1.创建一个Web页面并切换到设计视图。

2.在工具箱中双击ScriptManager、UpdatePanel、UpdateProgress控件添加到页面中。添加后页面如下:

3.在UpdatePanel控件中添加一个Label控件并设置它的Text属性值为“Panel Rendered”。

4.添加一个Button控件并设置它的Text属性值为“refresh”。

5.在UpdateProgress控件中添加文本text Processing…,并添加一个HtmlButton控件并设置它的Text属性为cancle。

6.双击refresh控件添加Click事件。

7.在Buttond的Click事件处理中添加如下代码,人为的创建一个3秒钟的延迟并显示当前服务器的时间。

protected void Button1_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(3000);

Label1.Text = DateTime.Now.ToString();
}
8.添加如下脚本,获取一个当前PageRequestManager类的实例,并创建一个函数调用abortPostBack方法来停止异步更新。

<!--
var prm = Sys.WebForms.PageRequestManager.getInstance();

function CancelAsyncPostBack() {

if (prm.get_isInAsyncPostBack()) {

prm.abortPostBack();

}
}
// -->
</script>
9.设置HtmlButton的click特性为CancelAsyncPostBack。

10.添加如下的样式块到<head>元素之间。

#UpdatePanel1 {

width:200px; height:100px;

border: 1px solid gray;

}

#UpdateProgress1 {

width:200px; background-color: #FFC080;

bottom: 0%; left: 0px; position: absolute;

}

</style>
11.保存并按Ctrl + F5运行。

12.单击refresh按钮,经过短暂的延时之后显示进度信息,完成异步更新之后UpdatePanel中的信息显示为当前的服务器时间。

13.单击refresh按钮并立即单击Cancle按钮结束异步更新,注意到UpdatePanel中的时间信息并没有更新。

二.通过客户端脚本显示或者隐藏进度信息

在下列情况下,UpdateProgress控件将不会自动显示:

由UpdateProgress控件关联的UpdatePanel之外的控件引发的异步更新。

UpdateProgress控件没有关联任何UpdatePanel,不在UpdatePanel中的控件引发的异步更新(例如用代码实现的更新)。

下面的例子将展示一个不在UpdateProgress所关联的UpdatePanel中的控件所引发的异步更新时,如何显示UpdateProgress控件。

1.在我们前面所创建的页面中,切换到设计视图。

2.选中UpdateProgress控件,在属性窗口中,设置AssociatedUpdatePanelID属性为UpdatePanel1。

3.在UpdatePanel和UpdateProgress控件之外添加一个Button控件。

4.设置Button的Text属性值为Trigger,并设置ID属性为Panel1Trigger。

5.选择UpdatePanel控件,在属性窗口中Triggers属性行单击ellipsis (…)。

6.创建一个异步更新触发器,并设置控件ID为Panel1Trigger。

7.双击Trigger按钮添加Click事件。

8.在Buttond的Click事件处理中添加如下代码,人为的创建一个3秒钟的延迟并显示当前服务器的时间,并附加上一条信息表示是由触发器引发的异步更新。

}
9.在代码窗口,在已有的<Script>脚本块中添加如下代码:

<!--

var prm = Sys.WebForms.PageRequestManager.getInstance();

function CancelAsyncPostBack() {

if (prm.get_isInAsyncPostBack()) {

prm.abortPostBack();

}

}

prm.add_initializeRequest(InitializeRequest);

prm.add_endRequest(EndRequest);

var postBackElement;

function InitializeRequest(sender, args) {

if (prm.get_isInAsyncPostBack()) {

args.set_cancel(true);
}

postBackElement = args.get_postBackElement();

if (postBackElement.id = 'Panel1Trigger') {

$get('UpdateProgress1').style.display = 'block';

}

}

function EndRequest(sender, args) {

if (postBackElement.id = 'Panel1Trigger') {

$get('UpdateProgress1').style.display = 'none';

}

}

// -->

</script>
10.保存并按Ctrl + F5运行。

11.单击Trigger按钮,如下所示:

[翻译自官方文档]

支持TerryLee的创业产品Worktile

Worktile,新一代简单好用、体验极致的团队协同、项目管理工具,让你和你的团队随时随地一起工作。完全免费,现在就去了解一下吧。

https://worktile.com

分类: [08] Web开发, [07] AJAX风云

绿色通道:
好文要顶
关注我
收藏该文与我联系

TerryLee

关注 - 33

粉丝 - 2798

+加关注

3

0

(请您对文章做出评价)

« 上一篇:ASP.NET AJAX入门系列(6):UpdateProgress控件简单介绍
» 下一篇:ASP.NET AJAX入门系列

posted @ 2006-11-12 22:59 TerryLee 阅读(21407) 评论(79) 编辑 收藏

< Prev12

评论列表

回复引用

#51楼 2007-10-20 11:34 testtest[未注册用户]

真不知道前面一堆的留言回复,怎么没有一个提到这个Cancel按钮OnClick语句写错最关键的问题?所谓的这些回复,到底有多少水平。还有楼主自己仔细试验过没有

回复引用

#52楼 2007-11-03 16:26 菜鸟也问问题[未注册用户]

@testtest

你看清楚没有,楼主明明写的是onclick="CancelAsyncPostBack()"
,什么时候变成onclick="CancelAsyncPostBack"了,难道
onclick="javascript:CancelAsyncPostBack();"
不是等价于onclick="CancelAsyncPostBack()"吗?

回复引用

#53楼 2008-02-25 22:34 凌绝顶[未注册用户]

我修改了一下,放在哪里都行。

<script language="javascript" type="text/javascript">

function CancelAsyncPostBack()

{

// var prm = Sys.WebForms.PageRequestManager.getInstance();

if (prm.get_isInAsyncPostBack())

{

prm.abortPostBack();

}

}

var prm;

window.onload = function()

{

prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_initializeRequest(InitializeRequest);

prm.add_endRequest(EndRequest);

}

var postBackElement;

function InitializeRequest(sender, args) {

if (prm.get_isInAsyncPostBack()) {

args.set_cancel(true);

}

postBackElement = args.get_postBackElement();

if (postBackElement.id = 'Button3') {

$get('UpdateProgress1').style.display = 'block';

}

}

function EndRequest(sender, args) {

if (postBackElement.id = 'Button3') {

$get('UpdateProgress1').style.display = 'none';

}

}

</script>

回复引用

#54楼 2008-04-11 17:05 Microbar

添加的这段脚本后,一个UpdatePanel更新会导致其他UpdatePanel的UpdateProgress进度信息也会显示,如何解决啊?

prm.add_initializeRequest(InitializeRequest);

prm.add_endRequest(EndRequest);

var postBackElement;

function InitializeRequest(sender, args) {

if (prm.get_isInAsyncPostBack()) {

args.set_cancel(true);

}

postBackElement = args.get_postBackElement();

if (postBackElement.id = 'PanelTargget') {

$get('UpdateProgress1').style.display = 'block';

}

}

function EndRequest(sender, args) {

if (postBackElement.id = 'PanelTargget') {

$get('UpdateProgress1').style.display = 'none';

}

}

支持(0)反对(0)

回复引用

#55楼 2008-06-10 21:00 zagelover

--引用--------------------------------------------------

阿蒙[匿名]: @Hunts.C

我想你的原因可能是这样:

你的ScriptManager控件放在body中

而你的javascript代码放在了ScriptManager控件之前的位置

因为html是逐行加载的

由于var prm = Sys.PageRequestManager.getInstance();在加载ScriptManager控件的js代码之前就被调用了,所以就出现了Sys未定义的情况

但是如果你把这行代码放在每个function中,或者把整段js代码放在ScriptManager控件之后,就不会出现这个问题了!

--------------------------------------------------------

这个好用,我试了半天,谢谢了呀
支持(0)反对(0)

回复引用

#56楼 2008-06-30 22:04 veinyf#163.com[未注册用户]

--引用--------------------------------------------------

zagelover: --引用--------------------------------------------------

阿蒙[匿名]: @Hunts.C

我想你的原因可能是这样:

你的ScriptManager控件放在body中

而你的javascript代码放在了ScriptManager控件之前的位置

因为html是逐行加载的

由于var prm = Sys.PageRequestManager.getInstance();在加载ScriptManager控件的js代码之前就被调用了,所以就出现了Sys未定义的情况

但是如果你把这行代码放在每个function中,或者把整段js代码放在ScriptManager控件之后,就不会出现这个问题了!

--------------------------------------------------------

这个好用,我试了半天,谢谢了呀

--------------------------------------------------------

!~已阅~!

很容易范这个毛病!

回复引用

#57楼 2008-12-04 16:33 liqinghua[未注册用户]

@阿蒙[匿名]

应该就是这个原因

回复引用

#58楼 2008-12-30 16:34 kalin[未注册用户]

第二个例子的源码,从ajax官方网站上看到的

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Button1_Click(object sender, EventArgs e)

{

System.Threading.Thread.Sleep(3000);

Label1.Text = DateTime.Now.ToString();

}

protected void Panel1Trigger_Click(object sender, EventArgs e)

{

System.Threading.Thread.Sleep(3000);

Label1.Text = DateTime.Now.ToString() + " - trigger";

}

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head id="Head1" runat="server">

<title>UpdateProgress Tutorial</title>

<style type="text/css">

#UpdatePanel1 {

width:200px; height:100px;

border: 1px solid gray;

}

#UpdateProgress1 {

width:200px; background-color: #FFC080;

bottom: 0%; left: 0px; position: absolute;

}

</style>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:ScriptManager ID="ScriptManager1" runat="server" />

<script language="javascript" type="text/javascript">

<!--

var prm = Sys.WebForms.PageRequestManager.getInstance();

function CancelAsyncPostBack() {

if (prm.get_isInAsyncPostBack()) {

prm.abortPostBack();

}

}

prm.add_initializeRequest(InitializeRequest);

prm.add_endRequest(EndRequest);

var postBackElement;

function InitializeRequest(sender, args) {

if (prm.get_isInAsyncPostBack()) {

args.set_cancel(true);

}

postBackElement = args.get_postBackElement();

if (postBackElement.id == 'Panel1Trigger') {

$get('UpdateProgress1').style.display = 'block';

}

}

function EndRequest(sender, args) {

if (postBackElement.id == 'Panel1Trigger') {

$get('UpdateProgress1').style.display = 'none';

}

}

// -->

</script>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<asp:Label ID="Label1" runat="server" Text="Panel rendered."></asp:Label><br />

<asp:Button ID="Button1" runat="server" Text="refresh" OnClick="Button1_Click" />

</ContentTemplate>

<Triggers>

<asp:AsyncPostBackTrigger ControlID="Panel1Trigger" />

</Triggers>

</asp:UpdatePanel>

<asp:Button ID="Panel1Trigger" runat="server" Text="Trigger" OnClick="Panel1Trigger_Click" />

<asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">

<ProgressTemplate>

Processing...

<input id="Button2"

type="button"

value="cancel"

onclick="CancelAsyncPostBack()" />

</ProgressTemplate>

</asp:UpdateProgress>

</div>

</form>

</body>

</html>

回复引用

#59楼 2008-12-30 16:37 boulder

第一个例子的源码。承kalin

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

protected void Button1_Click(object sender, EventArgs e)

{

System.Threading.Thread.Sleep(3000);

Label1.Text = DateTime.Now.ToString();

}

</script>

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>UpdateProgress Tutorial</title>

<style type="text/css">

#UpdatePanel1 {

width:200px; height:100px;

border: 1px solid gray;

}

#UpdateProgress1 {

width:200px; background-color: #FFC080;

bottom: 0%; left: 0px; position: absolute;

}

</style>

</head>

<body>

<form id="form1" runat="server">

<div>

<asp:ScriptManager ID="ScriptManager1" runat="server"/>

<script language="javascript" type="text/javascript">

<!--

var prm = Sys.WebForms.PageRequestManager.getInstance();

function CancelAsyncPostBack() {

if (prm.get_isInAsyncPostBack()) {

prm.abortPostBack();

}

}

// -->

</script>

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

<ContentTemplate>

<asp:Label ID="Label1" runat="server" Text="Panel rendered."></asp:Label><br />

<asp:Button ID="Button2" runat="server" OnClick="Button1_Click" Text="refresh" />

</ContentTemplate>

</asp:UpdatePanel>

</div>

<asp:UpdateProgress ID="UpdateProgress1" runat="server">

<ProgressTemplate>

Processing...

<input id="Button2"

type="button"

value="cancel"

onclick="CancelAsyncPostBack()" />

</ProgressTemplate>

</asp:UpdateProgress>

</form>

</body>

</html>

支持(0)反对(0)

回复引用

#60楼 2008-12-30 16:39 boulder

FYI,the url is

http://www.asp.net/AJAX/Documentation/Live/tutorials/ProgrammingUpdateProgress.aspx
支持(0)反对(0)

回复引用

#61楼 2009-01-06 17:22 游客512[未注册用户]

写得不错,能再深入点就更好了!

回复引用

#62楼[楼主] 2009-01-06 18:34 TerryLee

@游客512

写的比较早了……

支持(0)反对(0)

回复引用

#63楼 2009-02-17 11:37 小成小[未注册用户]

你好,我看了你的这篇文章,感觉非常不错!在此先谢谢你的共享了;另外还有一个问题谢谢您帮我解答一下:

是这样的,你的这篇文章里面用到了控件开发者提供的一些类,这些类你是在哪里查到的??还有很多讲控件的只讲了些基本的用法,有些想自己扩展都不行,我想问的是:你拿到一个陌生的控件,你会去怎么熟悉它???

回复引用

#64楼 2009-03-17 22:25 vistalin[未注册用户]

好文章是要回复的!!

回复引用

#65楼 2009-05-15 15:33 vince6799[未注册用户]

onclick="CancelAsyncPostBack()"换成OnClientClick="CancelAsyncPostBack()"

回复引用

#66楼 2009-05-17 23:28 Grart

使用MasterPageFile的页面ID和设计的时候不一至,请问这问题有方法能解决吗?

回复引用

#67楼[楼主] 2009-05-18 11:12 TerryLee

@Grart

可以使用ClientID属性。
支持(0)反对(0)

回复引用

#68楼 2009-05-22 13:26 小狼狗

good
支持(0)反对(0)

回复引用

#69楼 2009-07-10 12:03 xcstar[未注册用户]

学习中...

回复引用

#70楼 2009-07-16 14:42 Aloner

更上一台阶,但是最后一个示例是什么意思?仅仅是让Panel1Trigger 实现与 UpdatePanel 里的 button 相同效果?

Lee,虽然是译文,但你翻译的很棒。但是我更奢求能劳烦您,在示例前讲解下自己的想法,比如这个例子是为了实现了什么?
Thanks
支持(0)反对(0)

回复引用

#71楼 2009-07-16 14:45 Aloner

更上一台阶,但是最后一个示例是什么意思?仅仅是让Panel1Trigger 实现与 UpdatePanel 里的 button 相同效果?

Lee,虽然是译文,但你翻译的很棒。但是我更奢求能劳烦您,在示例前讲解下自己的想法,比如这个例子是为了实现了什么?
Thanks
支持(0)反对(0)

回复引用

#72楼 2009-07-24 15:38 zhu13802[未注册用户]

在panel外面多加几个Button,点击其它Button,UpdateProgress还是会显示啊...

回复引用

#73楼 2009-08-11 19:33 bluesky4485

引用zhu13802:在panel外面多加几个Button,点击其它Button,UpdateProgress还是会显示啊...
是的,我也碰到这个问题了。
怎么解决啊?
支持(0)反对(0)

回复引用

#74楼 2009-10-17 10:15 zxmzp2004

有没有在asp.net mvc中运用的例子啊?不需要那些page_load的后台代码。实现的效果就是左边是树形的导航,在右边显示内容
?,我的邮箱zxmzp2004@yahoo.com.cn十分感谢
支持(0)反对(0)

回复引用

#75楼 2010-12-01 21:55 manimanihou

第一个例子的源码。承kalin
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
System.Threading.Thread.Sleep(3000);
Label1.Text = DateTime.Now.ToString();
}
</script>
the north face outlet 96 north face denali 96 northface outlet

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>UpdateProgress Tutorial</title>
<style type="text/css">
#UpdatePanel1 {
width:200px; height:100px;
border: 1px solid gray;
}

支持(0)反对(0)

回复引用

#76楼 2011-07-25 10:59 只是找工的

Text属性为cancle 这个写错了!cancel
支持(0)反对(0)

回复引用

#77楼 2011-07-25 10:59 只是找工的

Text属性为cancle 这个写错了!cancel
支持(0)反对(0)

回复引用

#78楼 2011-12-27 11:46 秋之白桦

@哈哈[匿名]
顶你!我的也是按照同样的方法解决的
支持(0)反对(0)

回复引用

#79楼 2011-12-27 14:54 秋之白桦

@kalin
多谢了!正好解决了我的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: