XML Guestbook 2
Add Comment| Download File | SDK |
| guestbook2.zip (10kb) | Beta1 |
Introduction
Guestbook- is one of the component of a website which a web master loves to read
(Including Me!!!) . So here I have a guestbook for everyone. It uses XML as its
Database because all servers support XML files. Also you can customize the
viewing of XML file as you like.
Requirements
1) .NET SDK beta1 (Note: This example might not work on future
versions of the SDK).
2) ASP.NET supported web server.
Explanation
This example consists of 3 parts.
1) guestpost.aspx - Contains the code to post user information in a
XML file. It uses the Class "System.Xml.XmlDocument" and
the "System.Xml.XmlNavigator" to Read and Append
information in a XML file.
XmlNavigator provides very easy ways to navigate through a XML
document.
2) viewpost.aspx - This files is called from within the
guestpost.aspx page to show conformation of user posted data. It
uses "Request.Params[]" to get the data posted in a query
string calling the page.
3) viewguestbook.aspx - It uses the Class
"System.Xml.XmlDataDocument" to get the viewer data from
the XML file into a "System.Data.DataSet" object. After
the a DataSet object is created then it is very easy to manipulate
the Data to viewing purpose. In this example we use a
"Repeater" to display the data in the DataSet.
Code
1) guestpost.aspx :- The Guestbook post page
<%@ Import Namespace="System" %> <%@ Page Language="C#" EnableSessionState="False" Debug="True" %> <%@ Import Namespace="System.IO" %> <%@ Assembly Name="System.Xml" %> <%@ Import Namespace="System.Xml" %> <%-- These are the imported assemblies and namespaces need to run the guest book --%> <html> <head> <title>Welcome to Saurabh's GuestBook.</title> <script Language="C#" runat="server"> //This method is called when the submit button is clicked public void Submit_Click(Object sender, EventArgs e) { //the path to the Xml file which will contain all the data //modify this if you have any other file or directory mappings. string datafile = "db/guest.xml" ; //put the posting code within a Try-Catch block try { //proceed only if all the required fields are filled-in if(Page.IsValid&&Name.Text!=""&&Country.Text!=""&&Email.Text!=""){ errmess.Text="" ; //make an instance of the class XmlDocument XmlDocument xmldocument = new XmlDocument() ; //load the xml file you will use as your database. //Since we are working on a server we have to use 'Server.MapPath()' //to map the path to the database file //Also Open a FileStream to the Database //Keep "FileShare.ReadWrite" mode to enable sharing FileStream fin ; fin = new FileStream(Server.MapPath(datafile), FileMode.Open, FileAccess.Read, FileShare.ReadWrite) ; xmldocument.Load(new StreamReader(fin)) ; fin.Close(); //make an instance of DocumentNavigator class which will help us to //navigate in the loaded XML data file. DocumentNavigator navigator = new DocumentNavigator(xmldocument) ; //below code is very significant as it navigates through the //XML document and stores the required values //first move to the xml documents elements //(in my xml file this will be the 'Guests' Node) navigator.MoveToDocumentElement() ; //then insert First element (FirstChild) which will contain //all the information of a single guest posting navigator.Insert(TreePosition.FirstChild, XmlNodeType.Element, "Guest","","") ; //Insert the Element of Name as the First node of 'Guest' navigator.Insert(TreePosition.FirstChild, XmlNodeType.Element, "Name","","") ; //This is important to specify what kind of Value will the //Name element contain navigator.Insert(TreePosition.FirstChild, XmlNodeType.Text, "Name","","") ; //assign the Name element the Value from the Text //property of the TextBox navigator.Value=Name.Text ; //Go back to the Parent Node ie 'Guest' navigator.MoveToParent() ; //Insert another Element 'Country' After the FirstChild ie. //after the 'Name' node. navigator.Insert(TreePosition.After, XmlNodeType.Element, "Country","","") ; navigator.Insert(TreePosition.FirstChild, XmlNodeType.Text, "Country","","") ; navigator.Value=Country.Text ; navigator.MoveToParent() ; navigator.Insert(TreePosition.After,XmlNodeType.Element, "Email","","") ; navigator.Insert(TreePosition.FirstChild, XmlNodeType.Text, "Email","","") ; navigator.Value=Email.Text; navigator.MoveToParent() ; navigator.Insert(TreePosition.After,XmlNodeType.Element, "Comments","","") ; navigator.Insert(TreePosition.FirstChild, XmlNodeType.Text, "comments","","") ; navigator.Value=Comments.Value ; navigator.MoveToParent() ; navigator.Insert(TreePosition.After, XmlNodeType.Element, "DateTime","","") ; navigator.Insert(TreePosition.FirstChild, XmlNodeType.Text, "DateTime","","") ; //set the Date time stamp of the entry DateTime now = DateTime.Now ; navigator.Value=now.ToShortDateString()+" " +now.ToShortTimeString() ; //Create a stream to save the file FileStream fout ; fout = new FileStream(Server.MapPath(datafile), FileMode.Open, FileAccess.Write, FileShare.ReadWrite) ; //after making the necessary changes //Save the changes to the Xml Document xmldocument.Save(new StreamWriter(fout)) ; //free up the XML file from the Document file xmldocument=null ; fout.Close(); //Build a custom query sending the data posted to //another page for display //since it is a query we have to encode it in UTF8 format String QueryString="Name=" +System.Web.HttpUtility.UrlEncodeToString(Name.Text, System.Text.Encoding.UTF8); QueryString+="&&Country=" +System.Web.HttpUtility.UrlEncodeToString(Country.Text, System.Text.Encoding.UTF8); QueryString+="&&Email=" +System.Web.HttpUtility.UrlEncodeToString(Email.Text, System.Text.Encoding.UTF8); QueryString+="&&Comments=" +System.Web.HttpUtility.UrlEncodeToString(Comments.Value, System.Text.Encoding.UTF8); //go to the page viewpost.aspx and append the query string Page.Navigate("viewPost.aspx?" + QueryString); } else { //if any of the Fields are kept empty show an error message errmess.Text="Fill in all the required fields of the Guestbook."; } } catch (Exception edd) { //catch any other exception that occur errmess.Text="Cannot write to XML file because "+edd.ToString(); } } </script> <LINK href="mystyle.css" type=text/css rel=stylesheet> </head> <body topmargin="0" leftmargin="0" rightmargin="0"> <%-- Include a header file 'header.inc' --%> <!-- #Include File="header.inc" --> <br> <h3 align="center" class="newsbody">Guestbook Post Page.</h3> <br> <asp:label id="errmess" text="" style="color:#FF0000" runat="server" /> <form runat="server"> <table border="0" width="80%" align="Center"> <tr > <td class="newsheading"><b>Sign-in My GuestBook</b></td> <td class="newsheading"> </td> </tr> <tr class="newsbody" > <td>Name :</td> <td ><asp:textbox text="" id="Name" runat="server" /> <font color=#FF0000>*</font></td> </tr> <tr class="newsbody"> <td>Country :</td> <td><asp:textbox text="" id="Country" runat="server"/> <font color=#FF0000>*</font></td> </tr> <tr class="newsbody"> <td>E-Mail :</td> <td><asp:textbox test="" id="Email" runat="server"/> <font color=#FF0000>*</font></td> </tr> <tr class="newsbody"> <td>Comments :</td> <td><textarea id="Comments" cols="25" rows="4" runat="server" /> </td></tr> <tr class="newsbody"> <td colspan="2" > <asp:Button class="newsheading" Text="Submit" onClick="Submit_Click" runat="server"/> </td> </tr> </table> </form> <br> <h4 class="newsbody"><a href="viewguestbook.aspx">Click here </a> to view GuestBook.</h4> <br> <!-- #Include File="footer.inc" --> </body> </html> |
2) viewpost.aspx : The post conformation page.
<%@ Import Namespace="System" %>
<%@ Page Language="C#" Debug="true" %>
<html>
<head>
<title>Welcome to Saurabh's GuestBook.</title>
<script language="C#" runat="server" >
//execute this script when the page loads
void Page_Load(Object Src, EventArgs E)
{
//if the page is called from another page
if (!Page.IsPostBack) {
//get the different Parameters from the query string and store it
//to respective Labels
NameLabel.Text = Request.Params["Name"];
CountryLabel.Text= Request.Params["Country"] ;
EmailLabel.Text=Request.Params["Email"];
CommentsLabel.Text=Request.Params["Comments"] ;
}
if(Page.IsPostBack)
{
//else display an error
errmess.Text="This Page Cannot be called directly. " ;
}
}
</script>
<LINK href="mystyle.css" type=text/css rel=stylesheet>
</head>
<body topmargin="0" leftmargin="0" rightmargin="0" >
<!-- #Include File="header.inc" -->
<asp:label id="errmess" text="" style="color:#FF0000" runat="server" />
<center>
<h2 class="newsbody"><b>Thank You, for posting in My GuestBook.</b></h2>
<table align=center width="60%" border="0" cellspacing="2" cellpadding="1" >
<tr class="titheading"><td colspan="2">The information You Posted!
</td></tr><tr class="newsbody">
<td>Name :</td>
<td><asp:label id="NameLabel" text="" runat="server" /></td>
</tr>
<tr class="newsbody">
<td>Country :</td>
<td><asp:label id="CountryLabel" text="" runat="server" /></td>
</tr>
<tr class="newsbody">
<td>E-mail :</td>
<td><asp:label id="EmailLabel" text="" runat="server"/></td>
</tr>
<tr class="newsbody">
<td>Comments :</td>
<td><asp:label id="CommentsLabel" text="" runat="server" /></td>
</tr>
</table>
<br>
<h4 class="newsbody"><a href="viewguestbook.aspx">Click here </a>
to view GuestBook.</h4>
<br>
</center>
<!-- #Include File="footer.inc" -->
</body>
</html>
|
3) viewguestbook.aspx : The Guestbook viewing page.
<%@ Import Namespace="System" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Data" %> <%@ Assembly Name="System.Xml" %> <%@ Import Namespace="System.Xml" %> <%@ Page Language="C#" %> <%-- Needed Assemblies --%> <html> <head> <title>Welcome to Saurabh's GuestBook.</title> <script language="C#" runat=server> //run the script when the Page is Loaded public void Page_Load(Object sender, EventArgs e) { //the path to the Xml file which will contain all the data //modify this if you have any other file or directory mappings. string datafile = "db/guest.xml" ; //try-Catch block to read from an XML file try { //make an instance to the XMLDataDocument class //this class can read from an xml file in and ordered format XmlDataDocument datadoc = new XmlDataDocument(); //Open a FileStream to the Database FileStream fin ; fin = new FileStream(Server.MapPath(datafile),FileMode.Open, FileAccess.Read,FileShare.ReadWrite) ; // Infer the DataSet schema from the XML data and load the XML Data datadoc.DataSet.ReadXml(new StreamReader(fin)); //Databind the first table in the Dataset to the Repeater MyDataList.DataSource = datadoc.DataSet.Tables[0].DefaultView; MyDataList.DataBind(); //free up the XML file to be used by other programs datadoc=null; } catch (Exception edd) { //catch any other exceptions that occur errmess.Text="Cannot read from XML file because "+edd.ToString() ; } } </script> <LINK href="mystyle.css" type=text/css rel=stylesheet> </head> <body topmargin="0" leftmargin="0" marginwidth="0"> <!-- #Include File="header.inc" --> <asp:label id="errmess" text="" style="color:#FF0000" runat="server" /> <br> <h3 align="center" class="newsbody">My Guestbook.</h3> <ASP:Repeater id="MyDataList" runat="server"> <template name="headertemplate"> <table class="mainheads" width="100%" style="font: 8pt verdana"> <tr style="background-color:#FF9966"> <th> Name </th> <th> Country </th> <th> Email </th> <th> Comments </th> <th> Date/Time </th> </tr> </template> <template name="itemtemplate"> <tr style="background-color:#FFFFCC"> <td> <%# DataBinder.Eval(Container.DataItem, "Name") %> </td> <td> <%# DataBinder.Eval(Container.DataItem, "Country") %> </td> <td> <%# DataBinder.Eval(Container.DataItem, "Email") %> </td> <td> <%# DataBinder.Eval(Container.DataItem, "Comments") %> </td> <td> <%# DataBinder.Eval(Container.DataItem, "DateTime") %> </td> </tr> </template> <template name="footertemplate"> </table> </template> </ASP:Repeater> <!-- #Include File="footer.inc" --> </body> </html> |

