檢查用戶名稱是否存在?

  • 2724
  • 0

摘要:檢查用戶名稱是否存在?

最近小弟遇到想來作檢查用戶是否存在問題?

但是又不想整個畫面刷新

只想讓User在輸入後,離開焦點就跟後端資料庫連結做確認

但是唯一能想到就是AJAX的UpdatePanel (小弟愚鈍...crying)

參考網路一些作法,完全霧煞煞

蠻頭苦幹3天後,終於有所理解

在這裡分享小弟心得...希望對各大大有所幫助

也請大大們多多指教...THX!

PS:此方式需要3支code,基本上只有2支code,只是小弟我把js獨立出來

舊方法:Client <---連結資料- --> db

新方法:Client <---> 另一支Code(個人認為像是橋接功能) <---> db

 

1. chkAccount.aspx (Client所呈現畫面)

<head runat="server">
    <title>未命名頁面</title>
    <script type="text/javascript" src="chkAccount.js"></script>
</head>

        <div id="divAccount">
            Applying an account...
        </div>
        <input id="txtAccount" type="text" size="30" onblur="chkAccount()"/>
        <img alt="" id="imgproc" style="visibility: hidden" src="images/loading.gif"/>
        <br />
        <input type="submit"/>

2. 這支ValiAccount.aspx的原始碼其實啥都沒有,因為這支code是作橋接功能

目的在於chkAccount.aspx收到onblur後

把txtAccount的值傳給ValiAccount.aspx然後帶參數值(txtAccount)

再利用ValiAccount.aspx的後端程式碼來跟DB做連結取得資料並利用Response.Write

把資料印在畫面上,當然User是看不到ValiAccount.aspx所呈現出來的畫面

因為小弟我只是把值傳給ValiAccount.aspx,並無把頁面導到ValiAccount.aspx,所以User看到還是停留在chkAccount.aspx頁面

ValiAccount.aspx原始碼

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ValiAccount.aspx.cs" Inherits="XXX.ValiAccount" %>

ValiAccount.aspx後端

public partial class ValiAccount : System.Web.UI.Page
    {
        string MyID = "";

        protected void Page_Load(object sender, EventArgs e)
        {
            receiveParameters();
        }

        private void receiveParameters()
        {
            HttpRequest hr = Request;

            MyID = hr.QueryString["myId"];

            DataTable dt = SqlComm.Query("SELECT * FROM EMP WHERE ID='" + MyID + "'");

            if (dt.Rows.Count > 0)
            {
                Response.Write(dt.Rows[0]["LOG_NAME"]);
            }
            else
            {
                Response.Write("");
            }
        }
    }

3. chkAccount.js

var xmlHttp;
var proc;
 
// 此函式在建立 XMLHttpRequest 物件
function createXMLHttpRequest() 
{
  if (window.ActiveXObject) 
  { // IE
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  else if (window.XMLHttpRequest) 
  { // Other browser
    xmlHttp = new XMLHttpRequest();               
  }
}

// 程式由此執行 ( tag 裡設定 onblur="chkAccount()")
function chkAccount() 
{
  // 顯示處理中的圖片
  proc = document.getElementById("imgproc");
  proc.style.visibility = 'visible';

  // 建立XMLHttpRequest物件
  createXMLHttpRequest();
  var myId = document.getElementById("txtAccount").value;
  var url = "ValiAccount.aspx?myId=" + myId;

  // 將輸入的帳號傳至後端作驗證
  xmlHttp.onreadystatechange = callback; 
  xmlHttp.open("GET", url, true);
  xmlHttp.send(null);
}
 
/* XMLHttpRequest 物件 open 方法的參數說明: 
   xmlHttp.open(a,b,c)
   第一個參數 a 是 HTTP request 的方法:GET、POST、HEAD 中選一個使用(全大寫)
   第二個參數 b 是要呼叫的 url, 不過只能呼叫與本網頁同一個網域內的網頁
   第三個參數 c 決定此 request 是否採非同步進行
     如果設定為 true 則即使後端尚未傳回資料也會繼續往下執行後面的程式
     如果設定為 false 則必須等後端傳回資料後,才會繼續執行後面的程式
 */     

// 資料回傳之後,使用 callback 這個函數處理後續動作   
function callback() 
{
  if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) 
  {
    var div=document.getElementById("divAccount");
    div.innerHTML = "查詢中...";
    var mesg = xmlHttp.responseText;
    div.innerHTML = ""+mesg+"";
    setMessage(mesg, true);
  }
}

/* xmlHttp.readyState 所有可能的值:
     0 (還沒開始),
     1 (讀取中),
     2 (已讀取),
     3 (資訊交換中),
     4 (一切完成)

   xmlHttp.status 常見的值:
     200 (一切正常),
     404 (查無此頁),
     500 (內部錯誤)   
*/     
 
function setMessage(message, isValid) 
{           
  var messageArea = document.getElementById("divAccount");
  var fontColor = "red";

  if (isValid == "true" || isValid == "True") 
  {
    fontColor = "green";               
  }

  // 變更處理中的圖片
  imgfile = new Array(2);
  imgfile[0] = "images/ok.gif"
  imgfile[1] = "images/error.gif"

  if (message == "")
  {
    proc.src = imgfile[1];
  }
  else
  {
    proc.src = imgfile[0];
  }
  
  // 顯示是否有重複的帳號
  messageArea.innerHTML = "" + message + " ";
}

注意:小弟是在onblur作確認,所以當使用者輸入完離開焦點就會觸發驗證

 






Y2J's Life:http://kimenyeh.blogspot.tw/