本文主要实现了在donet中,前台界面与后台程序完成分离,以达到互不影响的效果,从而降低了前台后台之前的偶合度。(当然这种效果也只是相对的),就果我下面举的例子来说吧,会员注册和修改会员资料是在一个页面上显示。注册可以达到完成分离(后台程序可以完全不知道前台界面是什么样子的,也不需要知道前面界面窗体中包括哪些内容,即不需要知道前台将要传些什么值给我),但修改会员数据,就需要前台传个用户名来过,从而显示指定的用户信息。如果你采用其Cookies等用户级的变量来传的话,当然就可以达到完成分离的效果了。
2. tesaspx.htm---客戶端文件(即注冊修改會員資料頁面)
3.xmlHttp.cs---重載Page類(操作客戶端以XmlHttp發過的請求)
4.test.aspx---對應的tesaspx.htm的請求文件
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);
}
}
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 >
< 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)
{
}
}
}
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
}
}
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
}
}
個人感覺這麼做,可以方便前台人台與後台人員合作開發時,前台人台可以完全不懂donet就行了,這樣對於前台的如何更改,是否采用該頁都不會影響後台的程式。