摘要:檢查用戶名稱是否存在?
最近小弟遇到想來作檢查用戶是否存在問題?
但是又不想整個畫面刷新
只想讓User在輸入後,離開焦點就跟後端資料庫連結做確認
但是唯一能想到就是AJAX的UpdatePanel (小弟愚鈍...)
參考網路一些作法,完全霧煞煞
蠻頭苦幹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/