我们在web开发中经常会接触到ajax技术,同时ajax技术也有很多种实现方式,那么,我们今天从第一种方式说起:asp.net原生控件实现ajax。

 

  asp.net原生控件用于ajax技术的主要是updatepanel和scriptmanager,前者顾名思义,是一个可以用于盛放内容的容器,用于实现页面的局部更新,在使用的时候直接将需要更新的内容放入即可。后者用于调用一些服务和脚本:例如我们本次demo中使用javascript调用webservice服务。

 

  本次demo主要包含一个页面,一个web服务(webservice)和一个数据通用操作类(userhelper)来实现页面无刷新检测注册时昵称是否存在的功能。

 

  首先,我们需要建立一个web页面(此处选用webform),大致代码如下:

 

 

<%@ page language=”c#” autoeventwireup=”true” codebehind=”webform2.x.cs” inherits=”webapplication1.webform2″ %>

 

<!doctype html public “-//w3c//dtd xhtml 1.0 transitional//en” “https://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd”>

<html xmlns=”https://www.w3.org/1999/xhtml”>

<head runat=”server”>

    <title>注册</title>

    <script type=”text/javascript”>

        function check() {

            var name = document.getelementbyid(“txtname”).value;

            if (name == “”) {

                alert(“昵称不能为空!”);

            }

            else {

                webapplication1.webservice1.checkname(name, callbackcheck);

                function callbackcheck(result) {

                    if (result == false) {

                        document.getelementbyid(“checkfont”).innerhtml = “<span>该昵称已存在!请重新输入!</span>”;

                    }

                    else {

                        document.getelementbyid(“checkfont”).innerhtml = “<span>恭喜!该昵称可以使用!</span>”;

                    }

                }

            }

 

        }

    </script>

</head>

<body>

    <form id=”form1″ runat=”server”>

    <asp:scriptmanager runat=”server” id=”scriptmanager”>

        <services>

            <asp:servicereference path=”~/webservice1.asmx” />

        </services>

    </asp:scriptmanager>

    <asp:updatepanel id=”upnl” runat=”server” updatemode=”always”>

        <contenttemplate>

            <p>

                昵称:<asp:textbox id=”txtname” runat=”server”></asp:textbox><p id=”checkfont”>

                </p>

            </p>

        </contenttemplate>

        <triggers>

            <asp:asyncpostbacktrigger controlid=”btncheck” />

            <asp:postbacktrigger controlid=”btnrefresh” />

        </triggers>

    </asp:updatepanel>

    <asp:button id=”btncheck” runat=”server” onclientclick=”check();” text=”检测昵称” />

    <asp:button id=”btnrefresh” runat=”server” text=”刷新页面” />

    </form>

</body>

</html>

  我在这个页面中放入了一个scriptmanager,同时引用了一个webservice,然后将需要更新的部分放入了updatepanel。此外还有两个button,第一个用于检测昵称,第二个用于刷新页面。大家看过代码之后会发现我在updatepanel设置时加入了一个triggers,那么这个是干什么的呢?获取或设置触发对 updatepanel 控件进行更新的回发控件事件。可以看到,我将检测昵称的button设置为asyncpostbacktrigger模式,此为点击按钮时不刷新整个页面,只刷新updatepanel中的内容,而第二个按钮设为postbacktrigger模式,则会刷新整个页面。

 

  在第一个检测昵称的按钮点击时会调用一个js方法:check(),在check()函数中,我们首先去获取textbox中用户输入的名称,然后将名称传入js调用的webservice方法中进行操作,得到结果后再根据结果去设置p要显示的内容,如果存在则返回值为false。这里有一个js回调函数的概念:回调函数用于在异步操作中扩展第一个函数的功能,我们此处是为了在返回结果之后设置p的innerhtml的值。如果不使用回调函数而直接使用同步的话,可能会不执行函数的内容。

 

      接下来是webservice,在建立webservice时,需要注意将[system.web.script.services.scriptservice]这行代码的注释取消掉,vs2010中建立后会提示使用asp.net

 

ajax从脚本中调用此web服务时就需要这样,否则会调用不到该方法。webservice中代码如下:

 

  

 

复制代码

using system;

using system.collections.generic;

using system.linq;

using system.web;

using system.web.services;

 

namespace webapplication1

{

    /// <summary>

    /// webservice1 的摘要说明

    /// </summary>

    [webservice(namespace = “https://tempuri.org/”)]

    [webservicebinding(conformsto = wsiprofiles.basicprofile1_1)]

    [system.componentmodel.toolboxitem(false)]

    // 若要允许使用 asp.net ajax 从脚本中调用此 web 服务,请取消对下行的注释。

    [system.web.script.services.scriptservice]

    public class webservice1 : system.web.services.webservice

    {

 

        [webmethod]

        public string helloworld()

        {

            return “hello world”;

        }

        [webmethod]

        public bool checkname(string name) 

        {

            return userhelper.checkname(name);

        }

    }

}

复制代码

  我们此处调用的checkname方法,源自于数据通用类中的checkname方法,userhelper中实现方法代码如下:

 

  

 

复制代码

using system;

using system.collections.generic;

using system.linq;

using system.web;

using system.data;

using system.data.sqlclient;

 

namespace webapplication1

{

    public class userhelper

    {

 

 

        public static bool checkname(string name)

        {

            string con = @”data source=205zhangxk\sqlexpress;initial catalog=myqq;connect timeout=30;trusted_connection=true”;

            using (sqlconnection sqlcon = new sqlconnection(con))

            {

                string sql = “select count(*) from users where nickname='” + name + “‘”;

                sqlcon.open();

                sqlcommand cmd = sqlcon.createcommand();

                cmd.commandtext = sql;

                int res = int.parse(cmd.executescalar().tostring());

                if (res == 1)

                {

                    return false;

                }

                else

                {

                    return true;

                }

               

            }

        }

    }

}