Ajax调用后台方法的几种写法(二) Ajax.dll

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

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

<httpHandlers>
      <add verb="POST,GET" path="ajax/*.ashx" type="Ajax.PageHandlerFactory, Ajax" />
    </httpHandlers>

页面代码:

   <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代码:

 <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#后台代码:

 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代码:

<%@ 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="马上更新" οnclick="reload()"/>
<asp:GridView runat="server" ID="gv1"></asp:GridView>
</form><!--一定不能缺少runat为server的表单,要不然ajaxpro不会自动生成对应的脚本和导入相关的框架代码-->
</body>
</html>

C# 后台代码:

using System;
using System.Data;
public partial class ajaxpro_no_refresh_update_gridview : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        AjaxPro.Utility.RegisterTypeForAjax(typeof(ajaxpro_no_refresh_update_gridview));
        gv1.DataSource = CreateDataSouce(); gv1.DataBind();   //正是因为第一次Load就绑定了GridView,才有了它的表头。若此处从未绑定,上面的JS就无从找表头了
    }
    private DataTable CreateDataSouce()
    {//创建数据源
        DataTable dt = new DataTable();
        dt.Columns.Add("Id");
        dt.Columns.Add("rndNum");
        Random r = new Random();
        for (int i = 0; i < 20; i++) dt.Rows.Add(i, r.Next(1, 1000));
        return dt;
    }
    [AjaxPro.AjaxMethod]
    public DataTable GridViewSource()
    {
        return CreateDataSouce();   //返回了DataTable去前台
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值