Ajax 调用后台方法的几种写法(1)

本文介绍如何利用Ajax.dll及AjaxPro.dll实现网页局部刷新,重点讲解后台与前台交互过程,包括配置步骤、代码示例及局限性分析。

使用插件Ajax.dll或者AjaxPro.dll。咱使用了Ajax.dll,需先去网上下载Ajax.dll,然后引用到项目中,并在Web.Config中配置如下:

在system.web的节点下加上这句,

 

[csharp] view plain copy print ?
  1. <httpHandlers>  
  2.       <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" />  
  3.     </httpHandlers>  
<httpHandlers>
      <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" />
    </httpHandlers>

页面代码:

 

 

  1.    <div id="Div_1"> </div>   
  2. <asp:Button ID="btnOK" runat="server" Text="OK" OnClientClick="return CallTest();" />  
  3. <br/><asp:Label ID="lblEmpNo" runat="server"></asp:Label>  
   <div id="Div_1"> </div> 
<asp:Button ID="btnOK" runat="server" Text="OK" OnClientClick="return CallTest();" />
<br/><asp:Label ID="lblEmpNo" runat="server"></asp:Label>

JS代码:

 

 

[javascript] view plain copy print ?
  1. <script>  
  2. //这个方法用户接受并处理服务器端返回的结果。   
  3.        function getGroups_callback(response) {  
  4.            var dt = response.value; //这个值就是最终传回来的值,想怎么用就怎么用,反正回前台了。  
  5.            document.getElementById("Div_1").innerHTML = dt;  
  6.        }  
  7.   
  8.        function CallTest() {  
  9.            var EmpName = document.getElementById('txtClientId').value;  
  10.            WebFormAjax.Test(EmpName, getGroups_callback);  
  11.            return false;  
  12.        }   
  13.    </script>  
 <script>
 //这个方法用户接受并处理服务器端返回的结果。 
        function getGroups_callback(response) {
            var dt = response.value; //这个值就是最终传回来的值,想怎么用就怎么用,反正回前台了。
            document.getElementById("Div_1").innerHTML = dt;
        }

        function CallTest() {
            var EmpName = document.getElementById('txtClientId').value;
            WebFormAjax.Test(EmpName, getGroups_callback);
            return false;
        } 
    </script>

 

 

C#后台代码:

 

[csharp] view plain copy print ?
  1.  protected void Page_Load(object sender, EventArgs e)  
  2.         {  
  3.             Ajax.Utility.RegisterTypeForAjax(typeof(WebFormAjax));      //typeof的参数是该页面所在的类名  
  4.               
  5.         }  
  6. [Ajax.AjaxMethod]  //必须加上这个标签  
  7.         public string Test(string EmpName)  
  8.         {  
  9.             Thread.Sleep(3000);  
  10.             if (lblEmpNo != null)   //前台调用还是无法访问服务器控件Label,该控件为null,遗憾,也就是说明无法在后台给前台的服务器控件赋值  
  11.             {  
  12.                 lblEmpNo.Text = EmpName + "123";  
  13.             }  
  14.             return EmpName + "abc";  
  15.         }  
 protected void Page_Load(object sender, EventArgs e)
        {
            Ajax.Utility.RegisterTypeForAjax(typeof(WebFormAjax));      //typeof的参数是该页面所在的类名
            
        }
[Ajax.AjaxMethod]  //必须加上这个标签
        public string Test(string EmpName)
        {
            Thread.Sleep(3000);
            if (lblEmpNo != null)   //前台调用还是无法访问服务器控件Label,该控件为null,遗憾,也就是说明无法在后台给前台的服务器控件赋值
            {
                lblEmpNo.Text = EmpName + "123";
            }
            return EmpName + "abc";
        }

局限性:使用Ajax.dll在调用后台方面确实方便许多,但是无法再后台给前台的服务器控件赋值,只能在后台方法中返回值到前台,在前台通过JS赋值给控件。

 

 

其实本人的目的是想试验一个这样的功能,前台的按钮在后台事件中能给其他服务器控件赋值,特别是GridView绑定数据这种,但是由于数据量多,这个过程会比较慢,又想在前台加一个等待的遮罩提示,直到数据完全绑定到GridView上,遮罩层才消失。这就必须用Ajax。

很显然,上面的这种方式无法满足我,因为它无法再后台绑定GridView。但是它可以返回一个DataTable,然后在前台用JS取出DataTable的值,一行一行绑定到GridView上,这个复杂啊,郁闷啊,若再来个分页的,就更麻烦了。

 

这是从网上看来的一个例子,说明刚才的这种情况。此处用的是AjaxPro.dll,它与Ajax.dll区别不大。

Html代码:

 

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ajaxpro-no-refresh-update-gridview.aspx.cs" Inherits="ajaxpro_no_refresh_update_gridview" %>  
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3. <html xmlns="http://www.w3.org/1999/xhtml">  
  4. <head>  
  5.     <meta http-equiv="content-type" content="text/html;charset=utf-8" />  
  6.     <title>ajaxpro无刷新更新gridview数据</title>  
  7. </head>  
  8. <body>  
  9. <script type="text/javascript">  
  10.     function reload() {  
  11.         ajaxpro_no_refresh_update_gridview.GridViewSource(callback);  
  12.     }  
  13.     function callback(r) {  
  14.         var rows = r.value.Rows, tb = document.getElementById('gv1'),tr,td;  
  15.         while (tb.rows.length > 1) tb.deleteRow(1); //删除除了页头的行,此处保留了表头  
  16.         for (var i = 0; i < rows.length; i++) {  
  17.             tr = tb.insertRow(tb.rows.length);  
  18.             td = tr.insertCell(0); td.innerHTML = rows[i].Id;  
  19.             td = tr.insertCell(1); td.innerHTML = rows[i].rndNum;     //一个格子一个格子的赋值,多么悲催啊,况且它还没有分页行,这个例子就暂且参考吧。  
  20.         }  
  21.     }  
  22. </script> <table id="tb1"></table>  
  23. <form id="form1" runat="server"><input type="button" value="马上更新" onclick="reload()"/>  
  24. <asp:GridView runat="server" ID="gv1"></asp:GridView>  
  25. </form><!--一定不能缺少runat为server的表单,要不然ajaxpro不会自动生成对应的脚本和导入相关的框架代码-->  
  26. </body>  
  27. </html>  
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ajaxpro-no-refresh-update-gridview.aspx.cs" Inherits="ajaxpro_no_refresh_update_gridview" %>
<!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>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>ajaxpro无刷新更新gridview数据</title>
</head>
<body>
<script type="text/javascript">
    function reload() {
        ajaxpro_no_refresh_update_gridview.GridViewSource(callback);
    }
    function callback(r) {
        var rows = r.value.Rows, tb = document.getElementById('gv1'),tr,td;
        while (tb.rows.length > 1) tb.deleteRow(1); //删除除了页头的行,此处保留了表头
        for (var i = 0; i < rows.length; i++) {
            tr = tb.insertRow(tb.rows.length);
            td = tr.insertCell(0); td.innerHTML = rows[i].Id;
            td = tr.insertCell(1); td.innerHTML = rows[i].rndNum;     //一个格子一个格子的赋值,多么悲催啊,况且它还没有分页行,这个例子就暂且参考吧。
        }
    }
</script> <table id="tb1"></table>
<form id="form1" runat="server"><input type="button" value="马上更新" onclick="reload()"/>
<asp:GridView runat="server" ID="gv1"></asp:GridView>
</form><!--一定不能缺少runat为server的表单,要不然ajaxpro不会自动生成对应的脚本和导入相关的框架代码-->
</body>
</html>

C# 后台代码:

 

 

[csharp] view plain copy print ?
  1. using System;  
  2. using System.Data;  
  3. public partial class ajaxpro_no_refresh_update_gridview : System.Web.UI.Page  
  4. {  
  5.     protected void Page_Load(object sender, EventArgs e)  
  6.     {  
  7.         AjaxPro.Utility.RegisterTypeForAjax(typeof(ajaxpro_no_refresh_update_gridview));  
  8.         gv1.DataSource = CreateDataSouce(); gv1.DataBind();   //正是因为第一次Load就绑定了GridView,才有了它的表头。若此处从未绑定,上面的JS就无从找表头了  
  9.     }  
  10.     private DataTable CreateDataSouce()  
  11.     {//创建数据源  
  12.         DataTable dt = new DataTable();  
  13.         dt.Columns.Add("Id");  
  14.         dt.Columns.Add("rndNum");  
  15.         Random r = new Random();  
  16.         for (int i = 0; i < 20; i++) dt.Rows.Add(i, r.Next(1, 1000));  
  17.         return dt;  
  18.     }  
  19.     [AjaxPro.AjaxMethod]  
  20.     public DataTable GridViewSource()  
  21.     {  
  22.         return CreateDataSouce();   //返回了DataTable去前台  
  23.     }  
  24. }  

转载于:https://www.cnblogs.com/joyosblogs/p/3383937.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值