【转】在Atlas中实现检测postback progress的状态的方法。
2008-08-21 10:36
603 查看
用过Anthem这个AJAX框架的朋友可以直接对一个control通过设置属性来控制在partial postback时设置这个control的Enabled属性为false。AJAX的一个特性就是它暴露XmlHttpRequest的状态,因此很多AJAX框架都提供一种方法来让用户可以针对这个过程来编写一些提高用户体验的代码(当然也有其他功能的,但大多是为了这个目的)。
而Atlas中的postback progress这个过程是由pagerequestmanager类来管理的,它是sealed的,因此我们也就不能按Anthem的思路来解决这个问题了。有时候我们忽视了bindings的作用,在这里我用一个简单的例子来说明如何通过bindings解决这个问题:
<%@ Page Language="c#" AutoEventWireup="true" CodeBehind="viBlogLogin.aspx.cs" Inherits="viBlogging.viBlogLogin" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
</head>
<body>
<form id="form1" runat="server">
<atlas:ScriptManager id="sm" runat="server" EnablePartialRendering="true"></atlas:ScriptManager>
<atlas:UpdateProgress ID="upg" runat="server" ><ProgressTemplate>Updating</ProgressTemplate></atlas:UpdateProgress>
<atlas:UpdatePanel ID="testUP" runat="server">
<Triggers>
<atlas:ControlEventTrigger ControlID="btnSubmit" EventName="Click" />
</Triggers>
<ContentTemplate>
<asp:Label runat="server" ID="lblShow" />
</ContentTemplate>
</atlas:UpdatePanel>
<asp:TextBox runat="server" ID="tb" Text="Lorem Ipsum" /><br />
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
</form>
<script type="text/xml-script">
<page>
<components>
<button id="btnSubmit">
<bindings>
<binding dataContext="_PageRequestManager"
dataPath="inPostBack"
property="associatedElement"
propertyKey="disabled"
direction="In"
/>
</bindings>
</button>
</components>
</page>
</script>
</body>
</html>
using using System.Threading;
using Microsoft.Web.UI;
namespace viBlogging
{
{
{
{
lblShow.Text = tb.Text+" fanweixiao";
System.Threading.Thread.Sleep(2000);
}
}
}
实现原理:当程序运行时,有一个PageRequestManager的全局实例(global instance),它在xml-script的<page>里被展现。这个类游一个叫做isPostBack的属性,当页面正在执行postback的时候,isPostback会被设置成true。这个用来控制页面的部分回发(partial postback)和更新页面html内容的PageRequestManager可以告知我们postback的状态了。但是这一切我们都不需要知道它是什么时候发生的,用binding来完成就OK了。
这里有个小问题,UpdatePanel有三种基本的触发模式,在这里,如果把button放到了UpdatePanel里,那么只有第一次点击的时候会被设置成灰色的(enabled=false)。如果使用triggers来指定的话就工作正常,在atlas的官方文档上我没有找到关于说这两种用法有本质不同的地方,希望有知道的朋友告诉一声,thanks in advance ;-)
这是因为如果把Button放到了UpdatePanel并在第一次postback后,control的客户端副本(client couterpart)就会被dispose了,这样就无法实现我们想要的结果了。
而Atlas中的postback progress这个过程是由pagerequestmanager类来管理的,它是sealed的,因此我们也就不能按Anthem的思路来解决这个问题了。有时候我们忽视了bindings的作用,在这里我用一个简单的例子来说明如何通过bindings解决这个问题:
<%@ Page Language="c#" AutoEventWireup="true" CodeBehind="viBlogLogin.aspx.cs" Inherits="viBlogging.viBlogLogin" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
</head>
<body>
<form id="form1" runat="server">
<atlas:ScriptManager id="sm" runat="server" EnablePartialRendering="true"></atlas:ScriptManager>
<atlas:UpdateProgress ID="upg" runat="server" ><ProgressTemplate>Updating</ProgressTemplate></atlas:UpdateProgress>
<atlas:UpdatePanel ID="testUP" runat="server">
<Triggers>
<atlas:ControlEventTrigger ControlID="btnSubmit" EventName="Click" />
</Triggers>
<ContentTemplate>
<asp:Label runat="server" ID="lblShow" />
</ContentTemplate>
</atlas:UpdatePanel>
<asp:TextBox runat="server" ID="tb" Text="Lorem Ipsum" /><br />
<asp:Button ID="btnSubmit" runat="server" Text="Submit" OnClick="btnSubmit_Click" />
</form>
<script type="text/xml-script">
<page>
<components>
<button id="btnSubmit">
<bindings>
<binding dataContext="_PageRequestManager"
dataPath="inPostBack"
property="associatedElement"
propertyKey="disabled"
direction="In"
/>
</bindings>
</button>
</components>
</page>
</script>
</body>
</html>
using using System.Threading;
using Microsoft.Web.UI;
namespace viBlogging
{
{
{
{
lblShow.Text = tb.Text+" fanweixiao";
System.Threading.Thread.Sleep(2000);
}
}
}
实现原理:当程序运行时,有一个PageRequestManager的全局实例(global instance),它在xml-script的<page>里被展现。这个类游一个叫做isPostBack的属性,当页面正在执行postback的时候,isPostback会被设置成true。这个用来控制页面的部分回发(partial postback)和更新页面html内容的PageRequestManager可以告知我们postback的状态了。但是这一切我们都不需要知道它是什么时候发生的,用binding来完成就OK了。
这里有个小问题,UpdatePanel有三种基本的触发模式,在这里,如果把button放到了UpdatePanel里,那么只有第一次点击的时候会被设置成灰色的(enabled=false)。如果使用triggers来指定的话就工作正常,在atlas的官方文档上我没有找到关于说这两种用法有本质不同的地方,希望有知道的朋友告诉一声,thanks in advance ;-)
这是因为如果把Button放到了UpdatePanel并在第一次postback后,control的客户端副本(client couterpart)就会被dispose了,这样就无法实现我们想要的结果了。
相关文章推荐
- 在Atlas中实现检测postback progress的状态的方法
- IC不允许library和controllers类名相同:实现用户登录状态检测公用方法
- C# ping网络IP 实现网络状态检测的方法
- Android开发实现实时检测蓝牙连接状态的方法【附源码下载】
- Android编程实现检测当前电源状态的方法
- TCP套接口利用TCP自带的 SO_KEEPALIVE选项实现指定时间检测是否激活状态的方法
- Jquery的attr方法实现checkbox的选中状态所带来的问题解析
- 基于C#实现Windows服务状态启动和停止服务的方法
- 基于单片机的多按键多状态检测方法
- php实现html标签闭合检测与修复方法
- Android实现侦听电池状态显示、电量及充电动态显示的方法
- C# ping网络IP 实现网络状态检测
- DevExpress实现TreeList父子节点CheckState状态同步的方法
- Python获取电脑硬件信息及状态的实现方法
- 最简单配置方法!无线网络联网状态下 VirtualBox实现Window主机与虚拟机互相访问
- 利用Opencv中Houghline方法实现直线检测
- PHP实现的mysql主从数据库状态检测功能示例
- URL重写及干掉ASP.NET试图状态的实现方法
- linux C内存泄露检测实现及内存泄露检测的一般方法
- 防火墙、IPS、web应用防火墙、防毒墙等网关设备实现方式、检测方法