Håndlaget AJAX i .Net
I C# har vi verktøy for alle disse operasjonene.
Punkt 1 ovenfor har vi kontroll over via klassen Request. Vi kan f.eks. spørre etter en verdi slik:
String S = Request.QueryString["nummer"];
Punkt 2 har vi hele C# biblioteket til å hjelpe oss med.
Punkt 3 ordner vi med klassen Response som vi kan skrive til. F.eks slik:
Response.Write("<div>Hallo</div>");
Eksempel
Eksempelet er framvisning av Shakespeares sonetter, jQuery [1] brukt som javascriptbibliotek.
Det vi gjør er ganske enkelt å bruke "code-behind"-strategien og la vevsiden, aspx-fila, som skal returneres bestå av kun en linje:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="result.aspx.cs" Inherits="result" %>
Koden som kjører, result.aspx.cs, forholder seg bare til Request og Respons og skriver eksplisitt til den siste, istedet for å returnere en vevside slik som vi vanligvis gjør i nettløsninger. Page-objektet er uinteressant.
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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.Xml;
public partial class result : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
// get parameter
String S = Request.QueryString["nummer"];
int sonetteNum;
try
{
sonetteNum = Convert.ToInt16(S);
}
catch (Exception ex)
{
sonetteNum = 1;
}
sonetteNum=Math.Min(Math.Max(1,sonetteNum),154);
// get the XML-file with sonnetes
string physicalPath =HttpContext.Current.Server.MapPath(".").ToString();
String filename = physicalPath + "\\App_Data\\sonnetes.xml";
XmlDocument doc = new XmlDocument();
try
{
doc.Load(filename);
XmlNodeList list = doc.GetElementsByTagName("sonnet");
XmlElement p = (XmlElement)list.Item(sonetteNum-1);
XmlNodeList lines = p.GetElementsByTagName("line");
XmlNodeList heads = p.GetElementsByTagName("id");
String Res = "<h3>Nr: " + heads.Item(0).InnerText + "</h3>\r\n";
foreach (XmlNode n in lines)
{
Res += "<div>"+n.InnerText+"</div>\r\n";
}
Response.Write(Res);
}
catch (Exception ex)
{
Response.Write("Could not find a sonnette: "+ex.Message);
}
Response.Flush();
}
}
Request - Response
Request -ojektet som vi har tilgang på på serversiden gir oss all informasjon som er relevant i en http-request. Respons-objektet gir oss mulighet for å kontrollere det vi skal sende tilbake.
Følgende program er lagt ut på serveren og viser noe av den informasjonen vi kan ha bruk for. Programmet returnerer en minimalistisk HTML-side og er derfor ikke, uten endringer, egnet som "AJAX-leverandør":
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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.Collections.Specialized;
using System.Text;
public partial class tester : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
String method = Request.HttpMethod;
String user=Request.UserAgent;
NameValueCollection Qs=Request.QueryString;
String[] keys = Qs.AllKeys;
String raw=Request.RawUrl;
NameValueCollection Sv=Request.ServerVariables;
String[] svKeys = Sv.AllKeys;
HttpCookieCollection kaker=Request.Cookies;
String[] kakekeys = kaker.AllKeys;
Response.Write("<html>");
Response.Write(method);
Response.Write("<br/>"+user);
Response.Write("<hr/>");
Response.Write("<br/>" + raw);
for (int ix=0;ix<keys.Length;ix++)
Response.Write("<br/>" + keys[ix] + " : " + Qs[keys[ix]]);
Response.Write("<hr/>");
Response.Write("cookies:");
for (int ix = 0; ix < kakekeys.Length; ix++)
Response.Write("<br/>" + kakekeys[ix] + " : " + kaker[kakekeys[ix]].Value);
Response.Write("<hr/>");
for (int ix = 0; ix < svKeys.Length; ix++)
Response.Write("<br/>" + svKeys[ix] + " : " + Sv[svKeys[ix]]);
Response.Write("</html>");
}
}
Du kan kopiere denne URL'en, legge på parametere, eventuelt sette cookies og teste
den i en nettleser.
http://donau.hiof.no/borres/dn/demosite3/tester.aspx
Hvis du vil sette en cookie: http://donau.hiof.no/borres/dn/demosite3/tester2.aspx
Og så kan du se på http://donau.hiof.no/borres/dn/demosite3/tester.aspx om igjen.
Koden som kjører når vi setter en cookie ser slik ut:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;
public partial class tester2 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
HttpCookie cok=new HttpCookie("user","me");
cok.Expires = DateTime.Now.AddHours(1);
Response.SetCookie(cok);
Response.Write("<html>");
Response.Write("har satt en cookie: user:me");
Response.Write("<br/>expires at: "+cok.Expires.ToLocalTime().ToString());
Response.Write("</html>");
Response.Flush();
}
}