asp.net给我们带了了事件模型的编程机制,这使得我们将所有的任务都放在服务器上执行哪怕是一个小小变动,其实这到不是什么问题,可是有一点我们无法忍受,如果我们改变某一个输入框中的内容页面要刷新, 改变dropdownlist的选择项需要更新另一个dropdownlist需要刷新,真是郁闷。
下面我将描述一种原始的方法,之所以说它原是是因为这种方法在asp.net之前就已经有了,我想这两者之间的关系我不必详细描述,我们今天要说的是如何不刷新页面更新dropdownlist,该方法旨在抛砖引玉,其实使用该方法可以实现许多不刷新网页就和后台交互的应用,好了废话就不说了,看看我们的例子吧,首先我们需要一个放置两个dropdownlist的页面,假如它叫webform2.aspx,页面的代码如下:
<%@ page language="c#" codebehind="webform2.aspx.cs" autoeventwireup="false" inherits="webapptest1.webform2" %>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en" >
<html>
<head>
<title>webform2</title>
<meta content="microsoft visual studio .net 7.1" name="generator">
<meta content="c#" name="code_language">
<meta content="javascript" name="vs_defaultclientscript">
<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetschema">
<script>
function load(state){
var drp2 = document.getelementbyid("dropdownlist2");
for(var i = 0;i<=drp2.options.length -1;i++){
drp2.remove(i);
}
var ohttpreq = new activexobject("msxml2.xmlhttp");
var odoc = new activexobject("msxml2.domdocument");
ohttpreq.open("post", "webform6.aspx?state="+state, false);
ohttpreq.send("");
result = ohttpreq.responsetext;
odoc.loadxml(result);
items = odoc.selectnodes("//city/table");
for (var item = items.nextnode(); item; item = items.nextnode()){
var city = item.selectsinglenode("//city").nodetypedvalue;
var newoption = document.createelement("option");
newoption.text = city;
newoption.value = city;
drp2.options.add(newoption);
}
}
</script>
</head>
<body ms_positioning="flowlayout">
<form id="form1" method="post" runat="server">
<asp:dropdownlist id="dropdownlist1" runat="server"></asp:dropdownlist>
<asp:dropdownlist id="dropdownlist2" runat="server"></asp:dropdownlist>
</form>
</body>
</html>
上面的页面中有两个dropdownlist和一段js脚本,该脚本可以直接写在页面也可以写在后台在regeist到页面上(后者更灵活一些)该页的后台代码如下所示,在page_load里面写如下的代码:
if(!this.ispostback){
sqlconnection con = new sqlconnection("server=localhost;database=pubs;uid=sa;pwd=sa;");
sqldataadapter da = new sqldataadapter("select state from authors group by state",con);
dataset ds = new dataset();
this.dropdownlist1.datatextfield = "state";
this.dropdownlist1.datavaluefield = "state";
this.dropdownlist1.databind();
this.dropdownlist1.attributes.add("onchange","load(this.options[this.selectedindex].innertext)");
}
在上面的代码中我们做了两件事情:1、帮定其中一个dropdownlist(你也可以同时绑定两个)。2、指定该控件的客户端脚本。下面我们详细介绍一下上面的js代码,首先得到页面上要联动的dorpdownlist对象,将他的options清空,再创建两个客户端对象ohttpreq和odoc对象,其中一个负责发送请求另一个负责得到响应结果,我们将用户选择的state发送到名为webform6.aspx的页面,该页面将处理这个请求并返回一个响应,该响应的结果是一个xml文件,稍候介绍webform6.aspx里面的代码。我们将返回的结果使用loadxml方法load到odoc对象里面,然后就可以使用selectnodes方法得到所有的city节点,接着循环这些节点在客户端创建option对象,最后将这些option对象add到dropdwonlist2里面去。
下面我们看看webfowm6.aspx都做了些什么事情,该页面的html页面是一个除了包括<@page>指令意外什么都没有的页面,后台的page_load代码如下:
private void page_load(object sender, system.eventargs e){
// put user code to initialize the page here
if(this.request["state"]!=null){
string state = this.request["state"].tostring();
sqlconnection con = new sqlconnection("server=localhost;database=pubs;uid=sa;pwd=sa;");
sqldataadapter da = new sqldataadapter("select city from authors where state = '"+state+"'",con);
dataset ds = new dataset("city");
da.fill(ds);
xmltextwriter writer = new xmltextwriter(response.outputstream, response.contentencoding);
writer.formatting = formatting.indented;
writer.indentation = 4;
writer.indentchar = ' ';
ds.writexml(writer);
writer.flush();
response.end();
writer.close();
}
该方法得到用户选择的state通过查询以后得到一个dataset对象,使用该对象的writexml方法直接将内容写到response.outputstream里面然后传递到客户端,客户端的load方法通过result =ohttpreq.responsetext;句话得到一个xml字符串,最后解析此串。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器