Load usercontrol at runtime
hey eksperter!Jeg har rodet lidt med at lave en class som henter en template fil ind og loader designet over i en aspx fil og så bytter de [TOKENS] som der benyttes ud med en string, og dette virker også flawless. Men jeg ville heller bytte mine TOKENS ud med usercontrols frem for strings :) Jeg har stjålet iden fra design pattens i PHP hvor dette virker som en drøm.
Så min første ide var at registre de usercontrols i toppen af min page sådan her:
<%@ Register Src="Banner.ascx" TagName="Banner" TagPrefix="UC" %>
og så bytte min token ud med denne string:
<UC:Banner ID="Banner1" runat="server" />
Men den viser ikke min usercontrol.
Her er alt min kode:
Class Main.cs:
public class main
{
private string _line;
private string _template;
// Constructor som henter template filen ind i den Private variabel _template så den er klar til at manipuleres med.
public main()
{
using (StreamReader sr = new StreamReader(@"C:\Documents and Settings\href\My Documents\Visual Studio 2005\WebSites\TokensTest\main.tpl"))
while ((_line = sr.ReadLine()) != null)
{
_template += _line+ System.Environment.NewLine;
}
}
//Bytter Title token ud med det parameter som bliver med sendt hvis.
public void ReplaceTitle(string TitleText)
{
_template = _template.Replace("[TITLE]", TitleText);
}
//Bytter Banner token ud med det parameter som bliver med sendt hvis.
public void ReplaceBanner(string BannerText)
{
//Control Form = new Control();
//Form.Controls.Add(Control("Banner.ascx"));
_template = _template.Replace("[BANNER]", BannerText);
}
//Bytter Footer token ud med det parameter som bliver med sendt hvis.
public void ReplaceFooter(string FooterText)
{
_template = _template.Replace("[FOOTER]", FooterText);
}
//Bytter Menu token ud med det parameter som bliver med sendt hvis.
public void ReplaceMenu(string MenuText)
{
_template = _template.Replace("[MENU]", MenuText);
}
//Bytter Content token ud med det parameter som bliver med sendt hvis.
public void ReplaceContent(string ContentText)
{
_template = _template.Replace("[CONTENT]", ContentText);
}
//Køres når alle de tokens som siden benytter er byttede ud. For at skabe den fysiske side.
public string Create()
{
return _template;
}
}
Default.aspx:
<%@ Page Language="C#" %>
<%@ Register Src="Banner.ascx" TagName="Banner" TagPrefix="UC" %>
<script runat="server">
private string test;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
main objMain = new main();
objMain.ReplaceTitle("Min Title");
objMain.ReplaceBanner("dette er en lille banner");
objMain.ReplaceMenu("link<br>link<br>link<br>");
objMain.ReplaceContent("<h1>Hej med dig</h1><br>");
objMain.ReplaceFooter("Copyright @ hansen");
test = objMain.Create();
}
}
</script>
<% Response.Write(test); %>
Main.tpl:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>[TITLE]</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table width="800px">
<tr>
<td colspan="2" style="height:100px">[BANNER]</td>
</tr>
<tr>
<td valign="top">[MENU]</td>
<td valign="top">[CONTENT]</td>
</tr>
<tr>
<td colspan="2">[FOOTER]</td>
</tr>
</table>
</div>
</form>
</body>
</html>
i bund og grund tror jeg bare at jeg skal loade mine usercontrols at runtime, sådan at de bliver "renderet" lige inden page_load, men da jeg ikke ved så meget om de forskellige states en .NET aplication gennemgår så det er sikkert der jeg fejler...
Mange Hilsner
Troels Larsen
