動(dòng)態(tài)加載用戶控件的組件
2024-07-21 02:24:40
供稿:網(wǎng)友
動(dòng)態(tài)加載用戶控件的組件!(終結(jié)masterpages技術(shù))
讓我們來(lái)做個(gè)頁(yè)面模版吧!有了模版是不是就可以統(tǒng)一了呢!sure !
比如:模版頁(yè)template.ascx中我們留出中間一個(gè)部分,或者你想要留出的一個(gè)空間,讓以后放入你想要的內(nèi)容。
好了!那么在我們的頁(yè)面index.aspx上我們就可以引用這個(gè)template.ascx,然后在空出的部分放入我們特別的東西,當(dāng)然最好是在空的地方我們插入另外一個(gè)頁(yè)面如:list.ascx,
當(dāng)然我們?cè)谧鰝€(gè)頁(yè)面myarchive.aspx.同樣的我們引用這個(gè)template.ascx,然后再在空出大那個(gè)地方我們插入了另外一個(gè)頁(yè)面archive.ascx.
非常好。我們要的兩個(gè)index.aspx.和myarchive.aspx頁(yè)面是不是一樣的呢?就只有我們留空的那一個(gè)地方不一樣而已。
當(dāng)然這樣的應(yīng)用可以是各種各樣,可以不用框架集而達(dá)到更完美的效果。而你的頁(yè)面完全可以沒(méi)有重復(fù)的東西。因?yàn)槲覀兊捻?yè)面完全是組裝而成的!
那么有了這個(gè)美妙的想法之后我們就開(kāi)始去實(shí)現(xiàn)。
技術(shù)點(diǎn):1、怎么留出一個(gè)空間出來(lái),然后還要讓引用頁(yè)找到這個(gè)空間。
2、怎么引用模版而且還要找出留出的空間。
3、怎么引用另外一頁(yè)插入我們?cè)谀0骓?yè)中留出的空間。
其實(shí)所有這些就需要用到三個(gè)組件,一個(gè)是用來(lái)保留的空間,一個(gè)是用來(lái)引用頁(yè)面放入到我們保留出來(lái)的空間,這兩個(gè)組件其實(shí)只是起到標(biāo)記的作用而已。另一個(gè)也是主要的一個(gè)就是引用模版,然后處理引用頁(yè)面并插入到模版中去。
1、我們來(lái)解決的一個(gè)技術(shù)問(wèn)題,留個(gè)空間很容易的就是placeholder,那么我們還要考慮到id的問(wèn)題,因?yàn)槲覀冞€要找到這個(gè)地方,當(dāng)然我們可能要留幾個(gè)不同的地方,這樣就很有必要處理一下id的問(wèn)題。那么擴(kuò)展placeholder同時(shí)繼承inamingcontainer。
我們?nèi)∶麨椋簆lugarea
那么這個(gè)主要做的事情有兩件事,把本身保存起來(lái),然后在第三個(gè)組件用到的時(shí)候取出來(lái)。
public class plugarea : placeholder, inamingcontainer {
public override string id {
get {
return base.id;
}
set {
base.id = value;
addtocontext();
}
}
private static readonly string contextkey = "region.masterpages.region";
private void addtocontext() {
if ( httpcontext.current != null ) {
string mykey = contextkey + this.id;
if ( httpcontext.current.items.contains(mykey) ) {
throw new invalidoperationexception("這個(gè)id'" + this.id + "'已經(jīng)用了啦!.");
} else {
httpcontext.current.items[mykey] = this;
}
}
}
internal static plugarea findplugarea( string id ) {
if ( httpcontext.current == null ) {
return null;
}
return httpcontext.current.items[contextkey + id] as plugarea;
}
}
那么我們的template.ascx可以寫(xiě)成這樣
<%@ control %>
<%@ register tagprefix="region" namespace="region.controls" assembly="region.controls" %>
<html>
<head>
<title>信息管理系統(tǒng)</title>
</head>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"> <form runat="server" id="form1">
<table width = 800 align=center border=0 cellpadding=0 cellspacing=0><tr><td>
相同的第一部分
</td></tr><tr><td>
<region:plugarea id="part1" runat="server"/> </td></tr><tr><td>
相同的第二部分
</td></tr><tr><td>
<region:plugarea id="part2" runat="server"/>
</td></tr><tr><td>
相同的第三部分
</td></tr></table>
</form>
</body>
</html>
2、引用模版頁(yè)的時(shí)候,在里面標(biāo)記以下我們保留的空間應(yīng)該插入哪個(gè)頁(yè)面,標(biāo)記以下就可以了!具體的事情由引用模版頁(yè)的組建來(lái)搞定。繼承placeholder
組建起名:signarea
兩件事情:一、只需把id設(shè)成我們要插入那個(gè)空間組件的id.
二、在后面把這個(gè)插入我們留出的空間的時(shí)候,把組建的路徑設(shè)成一樣的,避免路徑不一樣引起異常發(fā)生。
當(dāng)然,我們要在這個(gè)signarea內(nèi)應(yīng)用我們的頁(yè)面。
public class signarea: placeholder {
internal string directory;
public override string templatesourcedirectory {
get {
return directory;
}
}
}
我們可以這樣用:
<region: signarea id=" part1" runat="server">
這里可以用我前面的文章講loadsky來(lái)來(lái)引用用戶頁(yè)面,或直接寫(xiě)內(nèi)容放這里。
</region: signarea>
<region: signarea id=" part2" runat="server">
同上第一部分。
</region: signarea>
3、應(yīng)用我們的模版頁(yè)并處理其中的模塊插入。
繼承placeholder繼
命名:loadtemplate
做事情:一、重載addparsedsubobject事件,在記錄placeholder中的signarea
二、加載template頁(yè)。
三、根據(jù)signarea的id找到plugarea(用plugarea內(nèi)的findplugarea,也就是為什么要用靜態(tài)方法的原因),然后把signarea插入到plugarea中去。
這三件事做完事情也就做完了
看一下代碼:
public class loadtemplate : placeholder {
private arraylist signarealist = new arraylist();
protected override void addparsedsubobject(object obj)
{
if (obj is signarea) {
signarealist.add(obj);
}
}
protected override void oninit(eventargs e) {
this.gettemplate();
base.oninit(e);
}
private void gettemplate() {
if (templatefilepath == null) {
throw new exception("ã»óð䣰åò³£¡");
}
controls.add(page.loadcontrol(templatefilepath));
signareainsertintoplugarea();
}
private void signareainsertintoplugarea() {
foreach (signarea signarea in signarealist) {
plugarea plugarea = plugarea.findplugarea(signarea.id);
if (plugarea == null ) {
throw new exception("õò²»µ½²åèëµä¿õ¼ä'" + signarea.id + "'");
}
signarea.directory = templatesourcedirectory;
plugarea.controls.clear();
plugarea.controls.add(signarea);
}
}
public string templatefilepath{
get {
return (string)viewstate["templatefilepath"];
}
set {
viewstate["templatefilepath"] = value;
childcontrolscreated = false;
}
}
}
好我們來(lái)看看怎樣引用模版頁(yè)!index.aspx 頁(yè)面:
<%@ page %>
<%@ register tagprefix="region" namespace="region.controls" assembly="region.controls" %>
<region: loadtemplate runat="server" id="loadtemplate " templatefilepath ="~/template.ascx">
<region: signarea id="part1" runat="server">
<region: loadsky id="sky1" skinpath="~/list.ascx " runat="server"/>
</region: signarea>
<region: signarea id="part2" runat="server">
<region: loadsky id="sky2" skinpath="~/myarchive.ascx " runat="server"/>
</region: signarea>
</region:loadtemplate>
那么運(yùn)行一下完整的一個(gè)頁(yè)面就出現(xiàn)在我們面前了。當(dāng)然可以這樣生成所有想要的一樣風(fēng)格的頁(yè)面。
從一開(kāi)始寫(xiě)到現(xiàn)在,最后這里就變成了傳說(shuō)中的那個(gè)masterpages的技術(shù)。
網(wǎng)站運(yùn)營(yíng)seo文章大全提供全面的站長(zhǎng)運(yùn)營(yíng)經(jīng)驗(yàn)及seo技術(shù)!