国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

動(dòng)態(tài)加載用戶控件的組件

2024-07-21 02:24:40
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(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("&atilde;&raquo;&oacute;&eth;&auml;&pound;°&aring;&ograve;&sup3;&pound;&iexcl;");

}

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("&otilde;&ograve;&sup2;&raquo;&micro;&frac12;&sup2;&aring;&egrave;&euml;&micro;&auml;&iquest;&otilde;&frac14;&auml;'" + 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ù)!
  • 發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 沁源县| 通州区| 泸溪县| 云南省| 柏乡县| 林州市| 龙门县| 绍兴市| 星座| 和硕县| 秭归县| 大方县| 湟源县| 咸阳市| 丹寨县| 胶南市| 皮山县| 苍溪县| 万安县| 师宗县| 平谷区| 界首市| 永胜县| 祁阳县| 申扎县| 陇西县| 涿州市| 岳普湖县| 宜兰县| 邯郸县| 乌海市| 稻城县| 马龙县| 招远市| 阳高县| 漠河县| 林周县| 海口市| 海口市| 桑植县| 广安市|