对于XmlHttp的介绍见http://www.cnblogs.com/helimin19/archive/2004/12/03/72519.aspx
,
本文主要实现了在donet中,前台界面与后台程序完成分离,以达到互不影响的效果,从而降低了前台后台之前的偶合度。(当然这种效果也只是相对的),就果我下面举的例子来说吧,会员注册和修改会员资料是在一个页面上显示。注册可以达到完成分离(后台程序可以完全不知道前台界面是什么样子的,也不需要知道前面界面窗体中包括哪些内容,即不需要知道前台将要传些什么值给我),但修改会员数据,就需要前台传个用户名来过,从而显示指定的用户信息。如果你采用其Cookies等用户级的变量来传的话,当然就可以达到完成分离的效果了。
1。xmlHttp.js---用於處於客戶端的XMLHTTP數據
//
將所有的客戶端表單數據生成XML文件
function
GetAllFormData()
{
var
strXML
=
"
<Client>/r/n<FormData>/r/n
"
;
for
(
var
i
=
0
;i
<=
document.forms(
0
).item.length;i
++
)
{
strXML
+=
"
<
"
+
document.forms(
0
).item(i).name
+
"
>
"
;
strXML
+=
document.forms(
0
).item(i).value;
strXML
+=
"
</
"
+
document.forms(
0
).item(i).name
+
"
>/r/n
"
;
}
strXML
+=
"
</FormData>/r/n</Client>
"
return
strXML;
}
//
/向服務器發送XML文檔
function
Send(Str,URL)
{
var
Http
=
new
ActiveXObject(
"
Microsoft.XMLHTTP
"
)
Http.open(
"
POST
"
,URL,
false
)
Http.send(Str)
return
Http.responseText;
}
//
/獲得XML中指定的節點的值
function
GetXMLNodeValue(strXML,nodeName)
{
var
Dom
=
new
ActiveXObject(
"
Microsoft.XMLDOM
"
)
Dom.async
=
false
Dom.loadXML(strXML)
if
(Dom.parseError.errorCode
!=
0
)
{
delete
(Dom)
return
(
false
)
}
else
{
var
node
=
Dom.documentElement.selectSingleNode(
"
//
"
+
nodeName);
if
(node)
nodeValue
=
node.text;
delete
(Dom)
return
(nodeValue);
}
}
2. tesaspx.htm---客戶端文件(即注冊修改會員資料頁面)
<!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
>
<
HTML
>
<
HEAD
>
<
title
>
NewUser
</
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
language
="javascript"
src
="xmlHttp.js"
></
script
>
<
script
language
=javascript>
<!--
///本頁的測試用例
function Test()
{
var tmp
= Send(GetAllFormData(),"./test.aspx");
document.Form1.UserName.value
= GetXMLNodeValue(tmp,"UserName");
document.Form1.PassWord.value
= GetXMLNodeValue(tmp,"PassWord");
document.Form1.EMail.value
= GetXMLNodeValue(tmp,"EMail");
document.Form1.Question.value
= GetXMLNodeValue(tmp,"Question");
document.Form1.Answer.value
= GetXMLNodeValue(tmp,"Answer");
}

//--
>
</
script
>
</
HEAD
>
<
body
MS_POSITIONING
="GridLayout"
>
<
form
id
="Form1"
method
="post"
name
="Form1"
>
<
FONT
face
="新細明體"
>
<
DIV
style
="Z-INDEX: 102; LEFT: 192px; WIDTH: 288px; POSITION: absolute; TOP: 64px; HEIGHT: 200px"
ms_positioning
="FlowLayout"
>
<
DIV
>
用戶名:
<
INPUT
id
="UserName"
type
="text"
name
="UserName"
></
DIV
>
<
DIV
>
密碼:
<
INPUT
id
="PassWord"
type
="password"
name
="PassWord"
></
DIV
>
<
div
id
="HidPass"
runat
="server"
ms_positioning
="FlowLayout"
>
確認密碼:
<
INPUT
id
="ConPassWord"
type
="password"
name
="ConPassWord"
>
</
div
>
<
DIV
>
EMail:
<
INPUT
id
="EMail"
type
="text"
name
="EMail"
></
DIV
>
<
DIV
>
密碼提示語:
<
INPUT
id
="Question"
type
="text"
name
="Question"
></
DIV
>
<
DIV
>
密碼答案:
<
INPUT
id
="Answer"
type
="text"
name
="Answer"
></
DIV
>
<
DIV
id
="HidSafeCode"
runat
="server"
>
驗證碼:
<
INPUT
id
="CheckCode"
type
="text"
name
="CheckCode"
><
IMG
src
="SafeCode.aspx"
border
="0"
>
</
DIV
>
<
INPUT
type
="reset"
value
="Reset"
name
="reset"
>
<
INPUT
id
="Button3"
type
="button"
value
="XML"
name
="Button3"
onclick
="Test();"
>
</
DIV
>
</
FONT
>
</
form
>
</
body
>
</
HTML
>
3.xmlHttp.cs---重載Page類(操作客戶端以XmlHttp發過的請求)
using
System;
using
System.Collections;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Web;
using
System.Web.SessionState;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.HtmlControls;
using
System.Xml;
using
System.IO;
using
System.Collections.Specialized;
namespace
Model.Code

{

/**//// <summary>
/// xmlHttp---對XmlHttp的操作(繼承自OverridePage類,表示其子類都是對XmlHttp發送過來的數據進行操作)
/// 冷風.net,2005/03/26
/// </summary>
public class XmlHttp : OverridePage

{

public XmlHttp()
{}

/**//// <summary>
/// 生成XmlDocument對象
/// 作者:冷風,net,2005/03/26
/// </summary>
/// <param name="stream">xml格式的內存塊</param>
/// <returns>XmlDocument對象</returns>
protected System.Xml.XmlDocument CreateXmlDocument(System.IO.Stream stream)

{
System.Xml.XmlDocument doc = new XmlDocument();
try

{
doc.Load(stream);
}
catch

{
byte[] buffer = new byte[stream.Length];
stream.Read(buffer,0,buffer.Length);
string strXML = System.Text.UnicodeEncoding.Default.GetString(buffer,0,buffer.Length);
doc.LoadXml(strXML);
}
return doc;
}

/**//// <summary>
/// 獲得XmlNode中第一個指定的節點的文本值
/// 作者:冷風,net,2005/03/26
/// </summary>
/// <param name="node">XmlNode對象</param>
/// <param name="nodeName">要搜索的節點名稱</param>
/// <returns>節點的值</returns>
protected string GetXMLNodeValue(XmlNode node,string nodeName)

{
XmlNode subNode = node.SelectSingleNode("//"+nodeName);
return subNode.InnerText;
}

/**//// <summary>
/// 將XmlNode對象轉化為NameValueCollection對象
/// 作者:冷風,net,2005/03/26
/// </summary>
/// <param name="node">XmlNode對象</param>
/// <returns>NameValueCollection對象</returns>
protected NameValueCollection CreateNameValueCollectionFromXML(XmlNode node)

{
NameValueCollection nvc = new NameValueCollection();
for(int i=0;i<node.ChildNodes.Count;i++)

{
nvc.Add(node.ChildNodes[i].Name,node.ChildNodes[i].InnerText);
}
return nvc;
}

/**//// <summary>
/// 為了不返回不必要的數據,必須重載Render方法
/// 作者:冷風,net,2005/03/26
/// </summary>
/// <param name="writer">輸出參數</param>
protected override void Render(HtmlTextWriter writer)

{
}
}
}
4.test.aspx---對應的tesaspx.htm的請求文件
using
System;
using
System.Collections;
using
System.ComponentModel;
using
System.Data;
using
System.Drawing;
using
System.Web;
using
System.Web.SessionState;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.HtmlControls;
using
System.Xml;
using
System.IO;
using
System.Collections.Specialized;
namespace
Model.VIP

{

/**//// <summary>
/// test 的摘要描述。
/// </summary>
public class test : Code.XmlHttp

{
private string m_strXml="";
private void Page_Load(object sender, System.EventArgs e)

{
XmlDocument doc = this.CreateXmlDocument(this.Request.InputStream);
string userName = GetXMLNodeValue(doc.DocumentElement,"UserName");
DataSet ds = Code.Users.GetUserInfo(userName);
//如果存在數值則表明是修改會員信息,否則為新增加
if(ds!=null && ds.Tables[0].Rows.Count>0)

{
m_strXml = ds.GetXml();
}
else

{
NameValueCollection userInfo = this.CreateNameValueCollectionFromXML(doc.DocumentElement.FirstChild);
string returnValue = Code.Users.AddUser(userInfo);
if(returnValue=="OK")

{
m_strXml ="注冊成功!";
}
else

{
m_strXml = "注冊失敗 !";
}
}
Response.Write(m_strXml);
}

Web Form 設計工具產生的程式碼#region Web Form 設計工具產生的程式碼
override protected void OnInit(EventArgs e)

{
//
// CODEGEN: 此為 ASP.NET Web Form 設計工具所需的呼叫。
//
InitializeComponent();
base.OnInit(e);
}

/**//// <summary>
/// 此為設計工具支援所必須的方法 - 請勿使用程式碼編輯器修改
/// 這個方法的內容。
/// </summary>
private void InitializeComponent()

{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}