图1
完成了该Web页面的布置,我们仅仅是完成了一部分的工作,到此为止我们并没有进行过真正的编码。我想大家对ASP.NET中的代码后置技术肯定是了解或熟悉的,它将Web页面的布置工作和后端的编码工作区分开来,达到了良好的分离效果。下面我们就为该Web页面中的三个按钮分别编写消息相应函数:
private void btnOK_Click(object sender, System.EventArgs e){SaveXMLData();name.Text = "";email.Text = "";qq.Text = "";homepage.Text = "";comment.Text = "";}private void btnReset_Click(object sender, System.EventArgs e){name.Text = "";email.Text = "";qq.Text = "";homepage.Text = "";comment.Text = "";}private void btnView_Click(object sender, System.EventArgs e){// 显示所有用户的留言信息Response.Redirect( "ViewGuestBook.aspx" );}
其中,第一个按钮是最重要的,它能将用户的输入信息存储到XML文件中,调用的方法就是SaveXMLData();而第二个按钮仅仅完成文本框的重置清空工作;第三个按钮的作用是运用另一个Web页面显示所有的用户输入信息。同时,第一个按钮在成功保存信息后也会将浏览器导向到显示所有用户输入信息的页面。
下面我们来详细分析一下SaveXMLData()方法,其实现如下:
private void SaveXMLData(){try{// 创建一个XmlDocument对象,用于载入存储信息的XML文件XmlDocument xdoc = new XmlDocument();xdoc.Load( Server.MapPath( "guestbook.xml" ));// 创建一个新的guest节点并将它添加到根节点下XmlElement parentNode = xdoc.CreateElement( "guest" );xdoc.DocumentElement.PrependChild( parentNode );// 创建所有用于存储信息的节点XmlElement nameNode = xdoc.CreateElement( "name" );XmlElement emailNode = xdoc.CreateElement( "email" );XmlElement qqNode = xdoc.CreateElement( "qq" );XmlElement homepageNode = xdoc.CreateElement( "homepage" );XmlElement commentNode = xdoc.CreateElement( "comment" );// 获取文本信息XmlText nameText = xdoc.CreateTextNode( name.Text );XmlText emailText = xdoc.CreateTextNode( email.Text );XmlText qqText = xdoc.CreateTextNode( qq.Text );XmlText homepageText = xdoc.CreateTextNode( homepage.Text );XmlText commentText = xdoc.CreateTextNode( comment.Text );// 将上面创建的各个存储信息的节点添加到guest节点下但并不包含最终的值parentNode.AppendChild( nameNode );parentNode.AppendChild( emailNode );parentNode.AppendChild( qqNode );parentNode.AppendChild( homepageNode );parentNode.AppendChild( commentNode );// 将上面获取的文本信息添加到与之相对应的节点中nameNode.AppendChild( nameText );emailNode.AppendChild( emailText );qqNode.AppendChild( qqText );homepageNode.AppendChild( homepageText );commentNode.AppendChild( commentText );// 保存存储信息的XML文件xdoc.Save( Server.MapPath( "guestbook.xml" ));// 显示所有用户的留言信息Response.Redirect( "ViewGuestBook.aspx" );}catch( Exception e ) {}}
该方法主要运用了XmlDocument类、XmlElement类以及XmlText类等,这些类都是包含在System.Xml命名空间中的,所以请在代码文件的开头处添加using System.Xml的语句。该方法运用了一个try-catch语句块,在try部分首先通过创建一个XmlDocument对象来载入XML文件,然后创建根节点的儿子-guest节点并在guest节点下添加存储信息所必须的五个子节点。所有这些子节点都是XmlElement对象,它们是通过XmlDocument对象的CreateElement()方法来获取的。同时,XmlDocument对象还通过CreateTextNode()方法来获取文本信息并在后面将其添加到相对应的节点中。在合理的添加guest节点及其子节点以及文本信息后,XmlDocument对象通过Save()方法将用户输入的信息保存到XML文件中。最后,浏览器会导向到显示所有用户输入信息的页面。这样,该Web页面运行的效果如图2所示:
图2
下面我们来创建用于显示所有用户输入信息的页面-ViewGuestBook.aspx。在该Web页面中,我们要运用到XSLT技术,它能将前面创建的XML文件中的数据以HTML的形式显示出来。由于是运用XSLT技术显示用户输入信息的,所以在设计该Web页面时我们无需添加任何Web控件,只要重载该Web页面的Load()方法即可。
private void Page_Load(object sender, System.EventArgs e){// 创建一个XmlDocument对象以载入存储信息的XML文件XmlDocument xdoc = new XmlDocument();xdoc.Load( Server.MapPath( "guestbook.xml" ));// 创建一个XslTransform对象并导入XSL文件XslTransform xslt = new XslTransform();xslt.Load( Server.MapPath( "guestbook.xsl" ));string xmlQuery = "//guestbook";XmlNodeList nodeList = xdoc.DocumentElement.SelectNodes( xmlQuery );MemoryStream ms = new MemoryStream();xslt.Transform( xdoc, null, ms );ms.Seek( 0, SeekOrigin.Begin );StreamReader sr = new StreamReader( ms );// 显示输出结果Response.Write( sr.ReadToEnd() );}
该方法首先创建一个XmlDocument对象用于载入前面创建的XML数据文件,之后创建一个XslTransform对象并导入相应的XSL文件。通过该XSL文件中的内容它能将原来的XML文件中的数据格式化为HTML的形式并显示在浏览器中。因为其中运用到了XSLT转换,所以我们还得在代码文件的开头处添加using System.Xml.Xsl的语句。
下面便是XSL文件的源代码,其中最重要的部分是<xsl:template match="name"></xsl:template>一块。