Ordning och reda i webbprojektet
Förord
I denna artikel (min första här på Pellesoft och min första överhuvudtaget) tänkte jag gå igenom användningen av templatesidor samt filstrukturering i projekt och varför det är så viktiga när sajten börjar växa. Hämta hem exempelprojektet: WebTemplates.zipInnehåll
»»
»
»
»
Relaterade artiklar
Liten bakgrundshistoria
Vid slutet av sommaren 2004 bestämde jag mig för att lära mig c# och asp.net. Jag hade tidigare läst kurser i de båda ämnena men svårighetsgraden låg långt bortom mina tidigare kunskaper. Jag klarade inte kurserna med mer än en hårsmån vilket gjorde mig beslutsam att ta igen det jag inte klarade av på egen hand i ett makligare tempo.Jag satte genast igång med diverse projekt men många snabbt blev liggande pga av bristande kunskaper. Jag kom till en punkt där jag kände att jag inte kunde ta projektet vidare främst av den anledning att filerna låg utspridda lite här och var och det var väldigt jobbigt att hitta en fil och göra en förändring. Jag kom fram till att det måste finnas en bra modell för hur man bygger och uppdaterar projekt samt minimerar antalet sidor som måste kompileras. Efter veckor av letande och testande av olika modeller bestämde jag mig slutligen att skapa mig en egen. Detta visade sig vara lättare än vad jag tidigare trott.
Ett varningens ord
Jag är ingen skicklig programmerare. Kom gärna med feedback på hur koden/modellen kan utvecklas/snyggas till.
Mål
Mitt mål med det hela var dels att kunna bygga sajter som i princip kan växa i all oändlighet med ”oändliga” nivåer men som samtidigt är lättnavigerade. Något jag själv alltid vill veta när jag surfar runt på en sajt är att se var jag är, hur jag kom dit och hur jag lätt kan ta mig fram och tillbaka utan att tappa bort mig. Nästa grej var att sajten skulle vara lätt att uppdatera och det skulle gå snabbt att hitta bland filerna. Jag har tidigare jobbat på ett stort webbaserat företag där filerna till sajten låg utspridda på servrar över halva europa. Logiken bakom var lika med null och enda möjligheten att hitta det man ville var att memorera sökvägarna. Detta var både frustrerande och tidskrävande och jag ville komma bort från allt detta med min modell.
Modellen
Jag hade nu följande utgångspunkter:• En enda aspx-sida som grund.
• I aspx-sidan ville jag sedan kunna ladda in antingen html-sidor eller ascx-kontroller.
• Ett generiskt utseende.
• Jag ville helst inte kompilera om sajten om jag absolut inte var tvungen.
• Det skulle vara lätt att göra förändringar, alltså en strikt logisk filstruktur med logiska namn som det är lätt att hitta i.
Jag valde att försöka styra så mycket det bara gick i Global.asax. Där plockar jag bland annat in och bearbetar querystringen, laddar in dynamisk meta-information från textfiler.
Länkarna valde jag att bygga upp enligt följande princip:
index.aspx?page=Huvudsida,UnderSida1,UnderSida2 osv.
I detta fall pekar strängen på en fil som ligger i mappen ./Sidor/Huvudsida/UnderSida1/UnderSida2/UnderSida2.ascx alt. UnderSida2.html.
Varje sida har alltså sin egen mapp i applikationen. Mappens namn måste vara exakt detsamma som den fil den innehåller.
Varje mapp har även en fil som heter meta.txt och som innehåller det vanliga, title, keywords och description och ser ut så här:
Min title|Mina keywords|Beksrivningen
För att ombearbeta url:en anropar jag en funktion i sektionen Application_BeginRequest(). Jag separerar varje del page= och laddar in de i en array. Därefter bygger jag upp en sökväg som pekar på en fil i applikationen och inkluderar antingen en ascx-kontroll eller streamar in en html-fil.
Exempel (ladda hem exempelprojektet för att se hela koden)
private static string finishedFilePath;
protected void Application_BeginRequest(Object sender, EventArgs e)
{
finishedFilePath = "";
string queryPath = Request.Querystring["page"];
char[] splitter = {','};
string[] arrPaths = queryPath.Split(splitter);
string pathToReturn = "";
foreach(string path in arrPaths)
{
pathToReturn += path + "/";
}
finishedFilePath = pathToReturn + arrPaths[arrPaths.GetUpperBound(0)];
}
public static string FinishedFilePath
{
get
{
return finishedFilePath;
}
set
{
finishedFilePath = value;
}
}
I filen index.aspx.cs avgör jag sedan vad som ska visas i index.aspx.
Exempel:
override protected void OnInit(EventArgs e)
{
if(Request.QueryString["page"] == null)
{
//Jag använder en vanlig label och väljer här vad den ska innehålla
LabelPageControl.Controls.Add(Page.LoadControl("./Sidor/Huvudsida/Huvudsida.ascx"));
}
else
{
try
{
LabelPageControl.Controls.Add(Page.LoadControl("./Sidor/" + Global.FinishedFilePath + ".ascx"));
}
catch(Exception err)
{
try
{
LabelPageControl.Text = "";
StreamReader sr = new StreamReader(Server.MapPath("./Sidor/" + Global.FinishedFilePath +
".html"),Encoding.Default);
LabelPageControl.Text = sr.ReadToEnd();
sr.Close();
}
catch(Exception fileErr)
{
LabelPageControl.Text = "Leverera felmeddelande";
}
}
}
}
På samma sätt som jag bygger upp en sökväg till filen i filsystemet skapar jag även en visuell ”klickbar” sökväg som användaren kan använda för att navigera på sajten och som visar vilken väg användaren har gått. Ex. > Huvudsida > UnderSida1 > UnderSida2.
Den koden har jag utelämnat här men finns att se i exempelprojektet.
Jag har byggt en sida enligt modellen och hitills har det fungerat väldigt bra och responsen har varit god den med.
Det avslutar ungefär det jag ville visa. Kontakta gärna mig med frågor och tips.
Simon Dahlbacka
Ämnet är relevant, dock funderar jag varför du inte använt PathInfo direkt, utan byggt en egen med i princip samma funktionalitet. Kolla t.ex. in