在asp.net中使用ajax有两种方法:一种是使用ajax控件,一种是直接手动写代码。我比较喜欢自己手动写代码,那样子才知道如何创建、使用ajax,并且从中获得快感。如果只知道用ajax控件,则永远都不懂ajax,那只是固定死板的动作,只能说是“知其然,而不知所以然”。
下面是一个简单的示例:
1.在html页面中:
<script language="javascript" type="text/javascript">
function send_request(checker) {
//创建XMLHttpRequest;
http_request = false;
if (window.XMLHttpRequest) {
// 非IE 浏览器
http_request = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
//IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP"); //较新版本的IE
} catch (e) {
try {
http_request = new ActiveXOBject("Microsoft.XMLHTTP"); //旧版本IE
} catch (e) { }
}
}
else {
window.alert("不能创建 XMLHttpRequest对象,无法应用Ajax");
return false;
}
http_request.onreadystatechange = Check;//指定回调函数
if (checker == "Email") checkcontent = document.getElementById("TxtEmail").value;
http_request.open("get", "Handler.ashx?checkitem="+checker+"&&checkcontent="+checkcontent, true);
http_request.send(null);//发送上面创建的HTTP请求
}
function Check() {
if (http_request.readyState == 4)//发送成功
{
if (http_request.status == 200)//交易成功
{
//正式处理有信息
if (http_request.responseText == "1")
document.getElementById("checkphone").innerText = "手机号码不正确!";
}
}
}
</script>
2.在事件处理程序中:
<%@ WebHandler Language="C#" Class="Handler" %>
using System;
using System.Web;
using System.Text.RegularExpressions;
public class Handler : IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
string CheckItem = context.Request.QueryString["checkitem"].ToString();
string CheckContent = context.Request.QueryString["checkcontent"].ToString();
try
{//处理信息
if (CheckContent != null&&CheckContent!="null")
{
if (CheckItem == "Phone" || CheckItem == "Email")
{
string matchstring = @"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$";
if (CheckItem == "Phone")
{
matchstring = @"((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)";
}
if (!Regex.IsMatch(CheckContent, matchstring))//匹配失败
{
if (CheckItem == "Phone") context.Response.Write("1");
if (CheckItem == "Email") context.Response.Write("2");
}
}
catch (Exception ex)
{ throw ex; }
}
public bool IsReusable {
get {
return false;
}
}
}
关于readyState的说明
readyState属性包括五种可能的取值
0:(未初始化)send方法还没有被调用
1:(加载中)已调用了send方法,请求还在处理中
2:(已加载)send方法已完成,整个应答已接受
3:(交互中)正在解析应答
4:(已完成)应答已解析,准备好进行下一步处理