Kalender
En datafil kan se slik ut:
<?xml version="1.0"?> <days> <day number="7"> <![CDATA[dette er en mandag som alle andre]]> </day> </days>
Denne måten å lagre data på er neppe optimal, men den er enkel og lett inspiserbar i den forstand at vi kan lese datafiler i allminnelige teksteditorer.
Koden
Koden er slik, Default.aspx.cs,
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
public partial class _Default : System.Web.UI.Page
{
DateTime actualDate;
String EMPTY = "ingen notater";
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = "";
if (!this.IsPostBack)
Calendar1.SelectedDate = DateTime.Now;
actualDate = Calendar1.SelectedDate;
}
protected void TextBox1_Load(object sender, EventArgs e)
{
if(!this.IsPostBack)
TextBox1.Text = LoadNote(actualDate);
}
protected void ButtonUpdate_Click(object sender, EventArgs e)
{
try{
SaveNote(actualDate, TextBox1.Text);
}
catch (System.Web.HttpRequestValidationException ex)
{
Label1.Text = ex.Message;
}
}
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
Label1.Text = "";
actualDate = Calendar1.SelectedDate;
TextBox1.Text = LoadNote(actualDate);
}
protected void Calendar1_VisibleMonthChanged(object sender,
MonthChangedEventArgs e)
{
actualDate = e.NewDate;
Calendar1.SelectedDate = actualDate;
TextBox1.Text = LoadNote(actualDate);
}
// find file for month
protected String getFilename(DateTime d)
{
return String.Format(@"{0}\App_Data\{1}{2}.xml",
Path.GetDirectoryName(Request.PhysicalPath),
Convert.ToString(d.Year),
Convert.ToString(d.Month));
}
// load the note for one day
protected String LoadNote(DateTime d)
{
String filename = getFilename(d);
FileInfo source = new FileInfo(filename);
if (source.Exists)
{
// load this months file and parse it
XmlDocument doc = new XmlDocument();
try
{
doc.Load(filename);
XmlNodeList list = doc.GetElementsByTagName("day");
foreach (XmlElement p in list)
if (Convert.ToInt16(p.GetAttribute("number"))==d.Day)
return p.InnerText;
}
catch (Exception ex)
{
// errormessage in the label
Label1.Text = ex.Message;
return "";
}
}
// no note exist:
return EMPTY;
}
// save the note for one day
protected void SaveNote(DateTime d,String content)
{
if(content.CompareTo(EMPTY)==0)
return;
String filename = getFilename(d);
FileInfo source = new FileInfo(filename);
XmlDocument doc = new XmlDocument();
try
{
if (source.Exists)
{
// load it, parse it and update text
doc.Load(filename);
XmlNodeList list = doc.GetElementsByTagName("day");
Boolean done = false;
for (int ix = 0; (ix < list.Count) && (!done); ix++)
{
XmlElement p = (XmlElement)list.Item(ix);
if (Convert.ToInt16(p.GetAttribute("number")) == d.Day)
{
p.InnerXml =
String.Format(@"<![CDATA[{0}]]>", content);
done = true;
}
}
if (!done)
{
// create and insert a new day-element
XmlElement e=doc.CreateElement("day");
e.SetAttribute("number", Convert.ToString(d.Day));
e.AppendChild(doc.CreateCDataSection(content));
doc.DocumentElement.AppendChild(e);
}
}
else
{
// create new file content
String s =
String.Format(@"<?xml version=""1.0""?>
<days>
<day number=""{0}"">
<![CDATA[{1}]]>
</day>
</days>",
Convert.ToString(d.Day), content);
doc.LoadXml(s);
}
doc.Save(filename);
}
catch (Exception ex)
{
// errormessage
Label1.Text = ex.Message;
return;
}
}
}
IsPostBack
Merk egenskapen IsPostBack. Dersom denne er false betyr det at siden hentes for "første gang". Det er altså ikke returen i en round-trip. Det er derfor nyttig å bruke denne egenskapen for å avgjøre om vi skal sette initielle verdier i feltene på vevside. I dette tilfelle betyr en slik initialisering at vi setter dagens dato, DateTime.Now, som valgt dato.
Vevsiden
Koden ser slik ut:
Alle stildata for selve kalenderkontrollen er satt av Visual Studio på grunnlag av en valgt autoformattering.
Merk sideattributten ValidateRequest="false". Dette skrur av testing på om noe av det vi sender potensielt kan være en sikkerhetsrisiko. Kanskje ikke så lurt å skru den av, men det muliggjør at vi skriver "hva som helst" i teksten.
Hvis du kjører eksempelet så se på kildekoden og se hvordan denne skiller seg fra den aspx-fila vi plasserer på tjeneren. Se spesielt hvordan selve kalenderen er representert og hvordan data sendes tilbake til tjeneren med Javascriptfunksjonen __doPostBack().
Eventuelle data som blir laget ved testing, blir fjernet ved ujevne mellomrom.