<html> <head> <title>Welcome to Saurabh's GuestBook.</title> <script language="C //run the script when the Page is Loaded public void Page_Load(Object sender, EventArgs e) { // an label , its use stated later tryagain :
//the path to the Xml file which will contain all the data //modify this if you have any other file or directory mappings. //modify this if you have been directed here from Step 2 of the ReadMe file. 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();
// Infer the DataSet schema from the XML data and load the XML Data datadoc.DataSet.ReadXml(new StreamReader(Server.MapPath(datafile)));
//Databind the first table in the Dataset to the Repeter MyDataList.DataSource = datadoc.DataSet.Tables[0].DefaultView; MyDataList.DataBind();
//free up the XML file to be used by other PRograms datadoc=null;
} catch(IOException ed) { // Here I am for now trying to overcome a bug in my guestbook exapmle //the Bug is that only one class can either read or write to my XML // data file at a time. //If the file is being used my some some other page (eg the guest book viewing page) // then an IOException will be thrown // So to handle such situtations what we do is that // If an IOException is thrown the page goes again to the tryagain label //and tries to write again into the xml file //this goes on till finally the resource is freed and the xml file is written to.
goto tryagain ; } catch (Exception edd) { //catch any other exceptions that occur errmess.Text="Cannot read from XML file because "+edd.ToString() ; }
viewpost.aspx <%@ Import Namespace="System" %> <%@ Page Language="C<html> <head> <title>Welcome to Saurabh's GuestBook.</title> <script language="C //execute this script when the page loads void Page_Load(Object Src, EventArgs E) { //if the page is called from anothe page if (!Page.IsPostBack) { //get the diffrent Parameters from the querry 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. It has to be called from the Guestbook posting page." ; } } </script> <LINK href="mystyle.css" type=text/css rel=stylesheet> </head> <body topmargin="0" leftmargin="0" rightmargin="0" marginwidth="0" marginheight="0"> <!-- <asp:label id="errmess" text="" style="color: <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> <!-- </body> </html>
guestpost.aspx
<%@ Import Namespace="System" %> <%@ Page Language="C<%@ Import Namespace="System.IO" %> <%@ Assembly Name="System.Xml" %> <%@ Import Namespace="System.Xml" %> <%-- These are the imported assembiles and namespaces need to run the guest book --%>
<html>
<head> <title>Welcome to Saurabh's GuestBook.</title> <script Language="C ///<summary> /// This methord is called when the submit button is clicked ///</summary> public void Submit_Click(Object sender, EventArgs e) { //A label need to the goto statement explained below tryagain :
//the path to the Xml file which will contain all the data //modify this if you have any other file or directory mappings. //modify this if you have been directed here from Step 2 of the ReadMe file. string datafile = "db/guest.xml" ;
//put the posting code within a Try-Catch block try{
//proceed only if all the required feilds 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 mape the path to the database file
xmldocument.Load(Server.MapPath(datafile)) ;
//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 (ps: read this code carefully)
//first move to the xml documents elements (in my xml file this will come to 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.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() ;
//after making the necessary changes we Save the chenges to the Xml Document xmldocument.Save(Server.MapPath(datafile)) ; //free up the XML file from the Document file so that other programs can use it xmldocument=null ;
//Build a custom querry sending the data posted to another page for display //since it is a querry 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 querry string at its end. Page.Navigate("viewPost.aspx?" + QueryString);
} else { //if any of the Feilds are kept empty show an error message errmess.Text="Fill in all the required feilds of the Guestbook." ;
} } catch(IOException ed) { // Here I am for now trying to overcome a bug in my guestbook exapmle //the Bug is that only one class can either read or write to my XML // data file at a time. //If the file is being used my some some other page (eg the guest book viewing page) // then an IOException will be thrown // So to handle such situtations what we do is that // If an IOException is thrown the page goes again to the tryagain label //and tries to write again into the xml file //this goes on till finally the resource is freed and the xml file is written to. goto tryagain ; } catch (Exception edd) { //catch any other exception that occur errmess.Text="Cannot write to XML file because "+edd.ToString() ;