asp.net ajax回调函数

by admin on 2020年1月25日

JavaScript与Web
Service组合实现无刷新交互这篇文章我已经写得比较清楚了.客户端的
JavaScript怎么与服务端的Web
Service进行通信达到无刷新的AJAX功能.今天我将接着这里给大家写一篇扩展性文章.希望对大家有所帮助.
   
   
少说话多做事,我们还是直奔主题吧!先看看今天的扩展性文章涉及到的东东.
     1.建立ASP.NET AJAX网站项目
     2.建立MSSQL数据库test,并建立UserInfo表
     3.建立与UserInfo表对应的实体类UserInfo,并定义好成员属性(get,set)
     4.建立UserInfoCompontent组件类,封装数据的查询功能
     5.建立Web Service调用UserInfoCompontent类的方法(因为Web
Service才是与JavaScript交互的组件层)
     6.建立ASPX页面,掉用UserInfoCompontent把数据库的数据显示出来.
     7.在上一步建立的ASPX页面里定义与Web
Service交互的JavaScript方法,处理发送请求和响应请求的相关操作.

javascript 调用后台类(webservice)的语法:

一、二:第一、二步就不多说了吧,这两步要是就有问题的话我建议你可以转行干别的工作去了。下面是建立表的脚本:
   if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[UserInfo]’) and OBJECTPROPERTY
   (id,
   N’IsUserTable’) = 1)
   drop table [dbo].[UserInfo]
   GO
   CREATE TABLE [dbo].[UserInfo] (
    [userId] [int] IDENTITY (1, 1) NOT NULL ,
    [userName] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [userSex] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [userAge] [char] (10) COLLATE Chinese_PRC_CI_AS NULL ,
    [userTelephone] [varchar] (11) COLLATE Chinese_PRC_CI_AS NULL
,
    [userAddress] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
   ) ON [PRIMARY]
   GO

       
类名.方法名(参数1,参数2,……,参数n,回调函数)

三:建立UserInfo类并定义其成员与UserInfo表对应,设置其属性(get,set),UserInfo类的定义如下:
public class UserInfo
{
    public UserInfo(int id,string name,string sex,string age,string
telephone,string address)
    {
        this.UserId = id;
        this.UserName = name;
        this.UserSex = sex;
        this.UserAge = age;
        this.UserTelephone = telephone;
        this.UserAddress = address;
    }

调用上有两个差别:一是不需要使用变量接收返回值,二是要在所有参数后面加一个参数:回调函数。
例如,有个类的方法,
在后台调用是:

    private int _userId;
    public int UserId
    {
        get { return _userId; }
        set { _userId = value; }
    }

      string data =
Webservice.GetDate(Para1,Para2);
换到前台JavaScript调用时,就是如下的样子:首先引用webservice 如:

    private string _userName;
    public string UserName
    {
        get { return _userName; }
        set { _userName = value; }
    }

      <asp:ScriptManager ID=”ScriptManager1″ runat=”server” >
            <Services>
                <asp:ServiceReference Path=”Userwebservice.asmx”
/>
            </Services>
        </asp:ScriptManager>

    private string _userSex;
    public string UserSex
    {
        get { return _userSex; }
        set { _userSex = value; }
    }

 

    private string _userAge;
    public string UserAge
    {
        get { return _userAge; }
        set { _userAge = value; }
    }

 

    private string _userTelephone;
    public string UserTelephone
    {
        get { return _userTelephone; }
        set { _userTelephone = value; }
    }

图片 1图片 2Code
public class UserWebService : System.Web.Services.WebService {

    private string _userAddress;
    public string UserAddress
    {
        get { return _userAddress; }
        set { _userAddress = value; }
    }
}

        public UserWebService () {

四:建立UserInfoCompontent,封装数据的查询功能,详细定义如下所示:
public class UserInfoComponent
{
    private string _strCon;
    public string StrCon
    {
        get { return _strCon; }
        set { _strCon = value; }
    }

        //如果使用设计的组件,请取消注释以下行 
        //InitializeComponent(); 
    }

    public UserInfoComponent()
    {
        this.StrCon =
ConfigurationManager.AppSettings[“ConnectionString”];
    }

     public class User
    {
        public User(int id, string name)
        {
            this.UserId = id;
            this.UserName = name;
            
        }

    public  DataSet QueryAll()
    {
        string commandText = “Select * from UserInfo”;
        return QueryUserInfo(commandText);
    }

        private int _userId;
        public int UserId
        {
            get { return _userId; }
            set { _userId = value; }
        }

    public  UserInfo Query(int userId)
    {
        string commandText = “Select * from UserInfo where userId=” +
userId;
        DataTable dt = QueryUserInfo(commandText).Tables[0];
        UserInfo user = new
UserInfo(int.Parse(dt.Rows[0][0].ToString()),
            dt.Rows[0][1].ToString(),
            dt.Rows[0][2].ToString(),
            dt.Rows[0][3].ToString(),
            dt.Rows[0][4].ToString(),
            dt.Rows[0][5].ToString());
        return user;
    }

        private string _userName;
        public string UserName
        {
            get { return _userName; }
            set { _userName = value; }
        }

    public  DataSet QueryUserInfo(string commandText)
    {
        using (SqlConnection conn = new SqlConnection(StrCon))
        {
            using (SqlDataAdapter sda = new SqlDataAdapter(commandText,
conn))
            {
                using (DataSet ds = new DataSet())
                {
                    sda.Fill(ds);
                    return ds;
                }
            }
        }
    }
}

     
    }

五:建立Web Service调用UserInfoCompontent类的方法(因为Web
Service才是与JavaScript交互的组件层)
[ScriptService]
public class UserInfoWebService : System.Web.Services.WebService {

     public  DataSet QueryUserInfo(string commandText)
    {
        using (OleDbConnection conn = new OleDbConnection(StrCon))
        {
            using (OleDbDataAdapter sda = new OleDbDataAdapter(commandText, conn))
            {
                using (DataSet ds = new DataSet())
                {
                    sda.Fill(ds);
                    return ds;
                }
            }
        }
    }

    UserInfoComponent user = new UserInfoComponent();

    [WebMethod]
    public  User Query(int Id)
    {
        string commandText = “Select * from User where userId=” + Id;
        DataTable dt = QueryUserInfo(commandText).Tables[0];
        User user = new User(int.Parse(dt.Rows[0][0].ToString()),dt.Rows[0][1].ToString());
        return user;
    }

    public UserInfoWebService () {

   }

        //如果使用设计的组件,请取消注释以下行
        //InitializeComponent();
    }

 

    [WebMethod]
    public UserInfo GetUserInfo(int id)
    {
        return user.Query(id);
    }
}

 function GetName()
{
    var select=document.getElementById(“ddlstUser”);
    var empid=select.options[select.selectedIndex].value;  
    Webservice.Query(id,CallBackFunction);
}
那么,返回值到哪里去取呢?答案是到回调函数中,
       
回调函数的原型是:回调函数名(返回值)
当然,存储返回值变量的名字是开发人员随意取的,然后就可以在回调函数中使用这个返回值变量了。
例如,接着上面程序,写一个函数在文本框中显示姓名:

六:建立ASPX页面Default.aspx并在页面上拽一个GridView控件,调用UserInfoCompontent把数据库的数据显示出来.
    UserInfoComponent user = new UserInfoComponent();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataBindGridView();
        }
    }

function CallBackFunction(result)
{
   var
name=document.getElementById(“txtName”);
   txtName.value=result.UserName;
}

    private void DataBindGridView()
    {
        this.GridView1.DataSource = user.QueryAll();
        this.GridView1.DataBind();
    }

则在这个函数中,result就含有Webservice.Query(Para1,Para2,CallBackFunction)的返回值。

摘自文章:

     
为什么不直接调用类中的方法,而非要经过WebService呢?

上文我曾经说过,ASP.NET
AJAX允许我们直接调用后台类中的方法,但是我们不提倡这样做,而是提倡经过WebService的过渡。其原因有如下几点:

1.要使得某个类可以被JS调用,也需要在其中做一些修改,如增加一些属性(Attribute)等,这会对这些类造成一种“污染”。

2.我们知道了,使用ASP.NET
AJAX框架也需要从回调函数中获取返回值,而不是直接获取。考虑以下情况:如果某段JS需要调用三个后台方法完成一个操作,那么,就需要写三个回调函数。即要经过“调用第一个方法-第一个回调函数中调用第二个方法-第二个回调函数中调用第三个方法-第三个回调函数中取得返回值”。

这个过程很麻烦。而使用WebService后,我们可以将这个三个方法封装到一个WebService方法里,因为WebService是支持“变量=类名.方法名”这种传统的调用方法的。这样经过WebService过渡,JS中只要一个回调函数就可以了。

3.从本身特性上看,WebService比普通类更适合作为ASP.NET AJAX的后台方法。

七:在上一步建立的ASPX页面里定义与Web
Service交互的JavaScript方法,处理发送请求和响应请求的相关操作.这一步就是关键了。实现了在客户断通过JavaScript于Web
Servie通信,查询数据库并返回查询结果到页面上。
   
同上一篇文章一样,需要在页面上放置一个ScriptManager控件,应该他是ASP.NET
AJAX的核心。每一个ASP.NET
AJAX程序的页面上都必须要有一个ScriptManager控件。并指向先前我门定义好的Web
Service。如下:
    <asp:ScriptManager ID=”ScriptManager1″ runat=”server”>
        <Services>
          <asp:ServiceReference Path=”UserInfoWebService.asmx”
InlineScript=”true” />
        </Services>
    </asp:ScriptManager>

下面我们来下实现通信和处理请求及处理响应的客户端JavaScript方法;
在定义方法前我门先在页面上写一个文本框和一个按扭。文本框提供数据输入,按扭执行向服务端方法请求查询数据库操作。html代码如下:
请输入ID:<asp:TextBox ID=”TextBox1″
runat=”server”></asp:TextBox>
<input id=”Button1″ type=”button” value=”查询”
onclick=”showUserInfo()” />
现在该是写JavaScript方法的时候了。
<script language=”javascript” type=”text/javascript”>
function showUserInfo()
{
    var id=document.getElementById(“TextBox1”).value;
    UserInfoWebService.GetUserInfo(id,onGetUserInfoSuccess);
}
            
function onGetUserInfoSuccess(user)
{
    document.getElementById(“id”).innerText=user.UserId;
    document.getElementById(“name”).innerText=user.UserName;
    document.getElementById(“sex”).innerText=user.UserSex;
    document.getElementById(“age”).innerText=user.UserAge;
    document.getElementById(“tele”).innerText=user.UserTelephone;
    document.getElementById(“address”).innerText=user.UserAddress;
}
</script>
这里也许会有人会问到,你上面的onGetUserInfoSuccess()方法里所用到的id,name,sex….这些是那里来的呢?先好象没定义啊。是啊,我先前没定义他门呢,他是处理所查询到的数据库的数据的显示操作的,这到最后来,说来就来吧,在html里下一个表格或是从工具箱里拽一个表格控件出来。适当的调整下宽度,如下:
<table style=” 540px” border=”1″ bordercolor=”#663333″
cellpadding=”1″ cellspacing=”0″>
<tr>
      <td style=”text-align: center; 38px;”>编号</td>
      <td style=”text-align: center; 38px;”>姓名</td>
      <td style=”text-align: center; 45px;”>性别</td>
      <td style=”text-align: center; 35px;”>年龄</td>
      <td style=”text-align: center; 82px;”>电话</td>
      <td style=”text-align: center; 79px;”>地址</td>
  </tr>
  <tr>
      <td id=”id”></td>
      <td id=”name”></td>
      <td id=”sex”></td>
      <td id=”age”></td>
      <td id=”tele”></td>
      <td id=”address”></td>
   </tr>
</table>

图片 3 

文章写得不好,两只眼睛居然还要打架。大家有什么意见的请留言指出。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图