(實(shí)在很懶,關(guān)于動(dòng)態(tài)加載用戶(hù)控件的內容實(shí)在寫(xiě)也寫(xiě)不完,說(shuō)也說(shuō)不完。關(guān)系到asp.net的一切!) 我們要做沒(méi)有關(guān)聯(lián)cs文件的aspx葉面。其實(shí)葉面的東西并不在aspx上,而是在ascx上。Aspx所起的作用只是一個(gè)入口。對組件的引用而已,而組件就可以管理很多的ascx頁(yè)面,所謂的葉面ascx葉面也應該是沒(méi)有關(guān)聯(lián)cs的葉面。
所以整個(gè)系統所有的東西都是在組件里面,aspx是單純的訪(fǎng)問(wèn)入口,ascx是純頁(yè)面的東西。Aspx入口調用組件,組件調用ascx頁(yè)面以及相應客戶(hù)的交互。
只有這樣才能做到每工與后臺的很好的分開(kāi)。
完全可以有一個(gè)團隊來(lái)開(kāi)發(fā)頁(yè)面(純頁(yè)面不需要任何的cs代碼,全都是ascx),而有另一個(gè)團隊來(lái)開(kāi)發(fā)組件。最后組裝成整個(gè)系統,由aspx調用組件就可以了。
讓我們來(lái)作個(gè)無(wú)代碼關(guān)聯(lián)的ascx葉面,葉面上有個(gè)按鈕,然后寫(xiě)個(gè)組件加載這個(gè)ascx葉面,以及如何響應這個(gè)按鈕的事件!
(廢話(huà)一下,寫(xiě)文章有時(shí)候不廢話(huà)真是很痛苦的一件事情?。。゛scx葉面與處理葉面的后臺代碼分開(kāi)是一件非常好的事情,不知你有沒(méi)有發(fā)現一個(gè)葉面有只能與一個(gè)后臺代碼文件關(guān)聯(lián),不可能有兩個(gè)類(lèi)來(lái)關(guān)聯(lián)這個(gè)葉面。而用組件來(lái)加載ascx以及相應事件,那么你就可以用同一個(gè)葉面ascx而有很多種不同的組件調用??芍赜镁痛蟠蟮?。不僅在同一個(gè)項目?jì)戎赜?,而是想用就用?div style="height:15px;">
實(shí)例一下:
作個(gè)無(wú)關(guān)聯(lián)cs文件的ascx頁(yè)面。上面有個(gè)button. Id為 mybutton. 當然是run at server我們才能在組件中找到他了!ascx葉面也可以是文本文件。把后綴名改為ascx就行了。
用我前面寫(xiě)的loadskin來(lái)加載吧!然后在里面處理button 的onclick事件就可以了。
然后在aspx中引用這個(gè)組件就行了。當然也可以在ascx中引用,都是一個(gè)效果。
Ascx起名為a.ascx. 上面只有一個(gè)button
也是繼承SkinnedControl
namespace Region.Controls {
/// <summary>
/// 加載用戶(hù)組件,加載不同的組件
/// </summary>
public class Abutton : SkinnedControl {
Button bt;
public Abutton() : base()
{
base.SkinPath = "a.ascx";
}
/// <summary>
/// 初始化組建摸板,進(jìn)行必要的動(dòng)態(tài)設置或更新
/// </summary>
override protected void InitializeSkin(Control skin) {
bt = (Button)skin.FindControl("myButton");
bt.Click +=new EventHandler(bt_Click);
skin.DataBind();
}
/// <summary>
/// 獲取組件
/// </summary>
public override ControlCollection Controls {
get {
EnsureChildControls();
return base.Controls;
}
}
private void bt_Click(object sender, EventArgs e)
{
bt.Text = "心雨樓";
}
}
}
我么在寫(xiě)個(gè)同樣的組件叫ebutton 根Abutton一樣。
把事件改為bt.Text = "心雨樓?。。。。。。?!";
讓我們來(lái)看看無(wú)代碼的aspx是什么樣子的!
運行之后就這個(gè)樣子:
分別點(diǎn)擊之后就這樣:
相同的頁(yè)面做不同的事情。