返回> 网站首页 

[转载]非Ajax无刷之利用Asp.Net回调机制

yoours2013-11-30 15:00:24 阅读 1709

简介一边听听音乐,一边写写文章。

使用无刷,一种使用JS,另一种则使用AJax,使用起比较方便,但与后台的交互不是很好。
ClientScript.GetCallbackEventReference是asp.net提供的回调机制。

首先,要使用这个方法,必有继承一个接口:ICallbackEventHandler,
接口里面两个方法如下:
// 摘要:
        //     返回以控件为目标的回调事件的结果。
        // 返回结果:
        //     回调的结果。
        string GetCallbackResult();
        // 摘要:
        //     处理以控件为目标的回调事件。
        // 参数:
        //   eventArgument:
        //     一个字符串,表示要传递到事件处理程序的事件参数。
        void RaiseCallbackEvent(string eventArgument);

看说明很详细,我们的页面里面必有实现这个方法与前台交互,这下就方便了!ClientScript.GetCallbackEventReference用法,这个方法是在前台实现:

<script type="text/javascript">
   //需要调用这个方法启用后台方法

   //arg与context为前台需要传递给后台的参数,好好利用吧
   function CallServer(arg, context)
    {
         //this不用说了
        //arg是后台能接收到的方法,也是后台返回来的值
       //ReceiveServerData为后台执行完成后,前台执行的方法
       //context参数原封不动传给ReceiveServerData
        <%= ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context")%>;
     }

     //这个方法就是你要执行的前台操作,可以返回结果,也可以改变控件状态,自己喜欢吧~
    function ReceiveServerData(result, context)
     {
        ...
     }
</script>

有了这两个方法之后,就可以了。
以进度条为例,首先,在HTML文档中加入如下代码:
<div> 
<table class="statusTable"> <tr> 
<td id="progress1"> </td> 
<td id="progress2"> </td> 
<td id="progress3"> </td> 
<td id="progress4"> </td> 
<td id="progress5"> </td> 
<td id="progress6"> </td> 
<td id="progress7"> </td> 
<td id="progress8"> </td> 
<td id="progress9"> </td> 
<td id="progress10"> </td> 
</tr> </table> 
<asp:Label ID="Label1" runat="server" ForeColor="Red" Text="0"></asp:Label> 
</div> 
<div> 
<input id="btnRequest" type="button" value="请求" onclick="Request()" /> 
<input id="btnStop" type="button" value="停止" disabled="disabled" onclick="Stop()" /> 
</div> 

Js部分加入如下Js代码: 
<script language="javascript" type="text/javascript"> 
var idx = 0; 
var progressTimer; 
var progressInterval = 1000; 
function Request() 
document.getElementById("btnStop").disabled = ""; 
document.getElementById("btnRequest").disabled = "disabled"; 
if(idx >= 10) 
Clear(); 
return; 
var arg = idx; 
<%= ClientScript.GetCallbackEventReference(this, "arg", "GetMsgBack",null) %>; 
idx++; 
progressTimer = setTimeout('Request()',progressInterval); 

function GetMsgBack(result) 
document.getElementById('progress'+idx).style.backgroundColor = 'blue'; 
var status = Number(result) * 10; 
document.getElementById("Label1").innerHTML = status + "%"; 

function Stop() 
clearTimeout(progressTimer); 
Clear(); 

function Clear() 
idx = 0; 
document.getElementById("btnStop").disabled = "disabled"; 
document.getElementById("btnRequest").disabled = ""; 
document.getElementById("Label1").innerHTML = "0"; 
for (var i = 1; i <= 10; i++) 
document.getElementById('progress' + i).style.backgroundColor = 'transparent'; 
</script> 

css样式文件中加入如下代码: 
.statusTable 
width:100px; 
border:solid 1px #000000; 
padding-bottom:0px; 
margin-bottom:0px; 

.statusTable td 
height:20px; 

Asp.Net服务端实现回调代码如下: 
public partial class DigitStatus : System.Web.UI.Page, ICallbackEventHandler 
private string AspEventArgs; 
protected void Page_Load(object sender, EventArgs e) 

public void RaiseCallbackEvent(string EventArgs) 
AspEventArgs = EventArgs; 

public string GetCallbackResult() 
int i = Convert.ToInt32(AspEventArgs); 
i++; 
return i.ToString(); 
这样,一个简易的进度条就实现了

微信小程序扫码登陆

文章评论

1709人参与,0条评论