NET框架中有一个文件类型是一般处理文件(.ashx)。可以在ajax开发中作为服务器端使用。特别是当在请求停留在一个页面的时候,下面举个例子--实现html下拉列表的级连更新。
(1)ddlInnerJoin.aspx代码:
<head runat="server">
<title>无标题页</title>
<script type ="text/javascript" src="ddlInnerJoin.js"></script>
</head>
<body>
<form id="form1" runat="server">
<div>
<select id="major" onchange ="startRequest();">
<option value ="1">软件技术</option>
<option value ="2" >网络技术</option>
</select>
<select id="class">
</select>
</div>
</form>
</body>
(2)ddlInnerJoin.js代码:
var xmlHttp;
var requesttype="";
function createXmlHttp()
{
if(window.XMLHttpRequest)
{
xmlHttp=new XMLHttpRequest();//mozilla浏览器
}
else if(window.ActiveXObject)
{
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");//IE旧版本
}
catch(e)
{
}
try
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");//IE新版本
}
catch(e)
{
}
if(!xmlHttp)
{
window.alert("不能创建XMLHTTPREQUEST对象!");
return false;
}
}
}
function startRequest()
{
createXmlHttp();
//使用GET方式
var url="ddlInnerJoin.ashx?major="+document.getElementById("major").options.value;
xmlHttp.open("GET",url,true);
xmlHttp.onreadystatechange=bindclass;
xmlHttp.send(null);
}
function bindclass()
{
if(xmlHttp.readyState==4)
{
if(xmlHttp.status==200)
{
var selclass=document.getElementById("class");
//如果被动(被激发的)下拉有内容,要首先清空
while(selclass.hasChildNodes())
{
var node=selclass.children(0)
selclass.removeChild(node);
}
//获取响应内容
var result=xmlHttp.responseText;
//分割以方便绑定
var optiontext=result.split(' ');
//将分割后的内容绑定到被动下拉列表
for(var i=0;i<optiontext.length;i++)
{
var optionnode=document.createElement("OPTION");
optionnode.text=optiontext[i];
selclass.add(optionnode);
}
}
}
}
(3)ddlInnerJoin.ashx代码:
<%@ WebHandler Language="C#" Class="ddlInnerJoin" %>
using System;
using System.Web;
//由于要访问数据库,引入命名空间
using System.Data.SqlClient;
using System.Data;
public class ddlInnerJoin : IHttpHandler {
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
string majorid = context.Request.Params["major"].ToString().Trim();
string major = "";
//避免不识别汉字
if (majorid == "1")
{
major = "软件技术";
}
else if (majorid == "2")
{
major = "网络技术";
}
//从数据库提取数据
SqlConnection conn = new SqlConnection("server=.;database=Tuition;uid=sa;pwd=sa;");
SqlDataAdapter da = new SqlDataAdapter("select classname from dictblclass where classname like '" + major + "%'", conn);
DataSet ds = new DataSet();
da.Fill(ds);
//定义响应文本的格式,以返回
string result = "";
foreach (DataRow row in ds.Tables[0].Rows)
{
result +=row[0].ToString().Trim() + " ";
}
context.Response.Write(result.Trim ());
//context.Response.Write("Hello World");
}
public bool IsReusable {
get {
return false;
}
}
}
这样就可以轻松实现级连更新了,特别是数据量大的时候效果更明显。