動態載入使用者控制項的組件

來源:互聯網
上載者:User
動態|載入|控制項 動態載入使用者控制項的組件!(終結MasterPages技術)



讓我們來做個頁面模版吧!有了模版是不是就可以統一了呢!Sure !

比如:模版頁Template.ascx中我們留出中間一個部分,或者你想要留出的一個空間,讓以後放入你想要的內容。

好了!那麼在我們的頁面index.aspx上我們就可以引用這個Template.ascx,然後在空出的部分放入我們特別的東西,當然最好是在空的地方我們插入另外一個頁面如:List.ascx,

當然我們在做個頁面MyArchive.aspx.同樣的我們引用這個Template.ascx,然後再在空出大那個地方我們插入了另外一個頁面Archive.ascx.

非常好。我們要的兩個index.aspx.和MyArchive.aspx頁面是不是一樣的呢?就只有我們留空的那一個地方不一樣而已。

當然這樣的應用可以是各種各樣,可以不用框架組而達到更完美的效果。而你的頁面完全可以沒有重複的東西。因為我們的頁面完全是組裝而成的!

那麼有了這個美妙的想法之後我們就開始去實現。



技術點:1、怎麼留出一個空間出來,然後還要讓引用頁找到這個空間。

2、怎麼引用模版而且還要找出留出的空間。

3、怎麼引用另外一頁插入我們在模版頁中留出的空間。



其實所有這些就需要用到三個組件,一個是用來保留的空間,一個是用來引用頁面放入到我們保留出來的空間,這兩個組件其實只是起到標記的作用而已。另一個也是主要的一個就是引用模版,然後處理引用頁面並插入到模版中去。



1、我們來解決的一個技術問題,留個空間很容易的就是PlaceHolder,那麼我們還要考慮到ID的問題,因為我們還要找到這個地方,當然我們可能要留幾個不同的地方,這樣就很有必要處理一下ID的問題。那麼擴充PlaceHolder同時繼承INamingContainer。

我們取名為:PlugArea

那麼這個主要做的事情有兩件事,把本身儲存起來,然後在第三個組件用到的時候取出來。

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("這個ID'" + this.ID + "'已經用了啦!.");

} 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可以寫成這樣

<%@ Control %>

<%@ Register TagPrefix="Region" Namespace="Region.Controls" Assembly="Region.Controls" %>

<HTML>

<HEAD>

<title>資訊管理系統</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、引用模版頁的時候,在裡面標記以下我們保留的空間應該插入哪個頁面,標記以下就可以了!具體的事情由引用模版頁的組建來搞定。繼承PlaceHolder

組建起名:SignArea

兩件事情:一、只需把ID設成我們要插入那個空間組件的ID.

二、在後面把這個插入我們留出的空間的時候,把組建的路徑設成一樣的,避免路徑不一樣引起異常發生。

當然,我們要在這個SignArea內應用我們的頁面。

public class SignArea: PlaceHolder {

internal string Directory;

public override string TemplateSourceDirectory {

get {

return Directory;

}

}

}




我們可以這樣用:

<Region: SignArea id=" part1" runat="server">

這裡可以用我前面的文章講LoadSky來來引用使用者頁面,或直接寫內容放這裡。

</Region: SignArea>

<Region: SignArea id=" part2" runat="server">

同上第一部分。

</Region: SignArea>




3、應用我們的模版頁並處理其中的模組插入。

繼承PlaceHolder繼

命名:LoadTemplate

做事情:一、重載AddParsedSubObject事件,在記錄PlaceHolder中的SignArea

二、載入Template頁。

三、根據SignArea的id找到PlugArea(用PlugArea內的FindPlugArea,也就是為什麼要用靜態方法的原因),然後把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;

}

}

}






好我們來看看怎樣引用模版頁!index.aspx 頁面:

<%@ 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>




那麼運行一下完整的一個頁面就出現在我們面前了。當然可以這樣產生所有想要的一樣風格的頁面。



從一開始寫到現在,最後這裡就變成了傳說中的那個Masterpages的技術。



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。