欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP.NET之Ajax系列(一)

程序员文章站 2022-03-23 08:07:21
我们在web开发中经常会接触到ajax技术,同时ajax技术也有很多种实现方式,那么,我们今天从第一种方式说起:asp.net原生控件实现ajax。     asp....
我们在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;

                }

               

            }

        }

    }

}