ASP.NET之Ajax系列(一)

來源:互聯網
上載者:User

標籤:style   blog   http   java   color   使用   

  我們在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.aspx.cs" Inherits="WebApplication1.WebForm2" %><!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 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>            <div>                暱稱:<asp:TextBox ID="txtName" runat="server"></asp:TextBox><div id="checkFont">                </div>            </div>        </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方法中進行操作,得到結果後再根據結果去設定div要顯示的內容,如果存在則傳回值為false。這裡有一個js回呼函數的概念:回呼函數用於在非同步作業中擴充第一個函數的功能,我們此處是為了在返回結果之後設定div的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 = "http://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;                }                           }        }    }}

  我在操作時串連了本地的資料庫MyQQ,該方法實現即為尋找名稱,然後返回受影響的行數並返回結果。下面我們開始調試代碼:

  

  我們可以看到資料庫中已經存在如下11條暱稱,在運行時我們輸入“豆豆”並點擊檢測暱稱按鈕,會發現代碼進入到WebSerivce中:

  

  此時說明js指令碼調用WebService方法已經成功,接下來會執行通用操作類中的方法:

  

  和我們意料之中相同,“豆豆”這個暱稱已經在資料庫存在,接下來我們看看最終的結果:

  

  在頁面上已經出現了我們預期的結果,我們再來試試輸入另外一個不存在的暱稱:

  

  也已經達到了我們預期的效果。由於局部重新整理的圖不太容易截到,這裡就無法為大家呈現了。我們大家都知道伺服器端Button在點擊時都會出現響應回傳,因此點擊另外一個重新整理頁面的按鈕,頁面會有明顯的閃爍(整個頁面全部重新整理),這也體現了Ajax技術帶來的優勢,提升了使用者的體驗度。

  我們通過一個簡單的Demo重現了ASP.NET 原生控制項實現Ajax的功能,這也體現了ASP.NET本身封裝的強大之處,同時使用起來也很方便。但是由於ScriptManager和UpdatePanel控制項本身為伺服器端控制項,在一定程度上會產生一些垃圾代碼,而且在請求時會產生整個頁面的控制項樹,因此在大量使用的情況下會導致資源的佔用率很高,這也是它本身的缺點。下次我會為大家帶來Ajax的另一種實現方式:JQuery內建的ajax()方法結合ashx一般處理常式實現,這是一種輕量級的實現方式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.