日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

让WEB FORM更像WINDOWS FORM: 控制窗体事件

發(fā)布時(shí)間:2025/3/15 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 让WEB FORM更像WINDOWS FORM: 控制窗体事件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[按]
你可能會(huì)誤解本文標(biāo)題:讓W(xué)EB FORM 更像WINDOWS FORM。 你也許會(huì)把本文當(dāng)作是討論應(yīng)用程序界面. 其實(shí)本文討論的是ASP.NET表現(xiàn)層設(shè)計(jì)。? 也許會(huì)給你一點(diǎn)啟示:如何設(shè)計(jì)邏輯隔離良好的、更容易設(shè)計(jì)和管理的應(yīng)用程序。作者是一個(gè)偏向于應(yīng)用的開發(fā)人員,因此可能在某些方面涉論不深,希望可以與有更多想法的朋友交流。作者的電子郵件xujian(a)nwpu.edu.cn

[引言]
在項(xiàng)目設(shè)計(jì)和實(shí)施的過程中,我經(jīng)常再想,既然我們必須給用戶以樣式美觀并且易用的用戶界面,就應(yīng)該好好設(shè)計(jì)表現(xiàn)層的UI邏輯。或者想辦法把業(yè)務(wù)邏輯、系統(tǒng)邏輯、和UI邏輯隔離得更好。使界面相關(guān)元素得到最大程度的重用和最大的靈活性。

本文的核心論述對(duì)象是ASCX(ASP.NET User Controls)。這里我們把ASCX比作WIN32應(yīng)用程序的”窗體(FORM)“。我們知道,設(shè)計(jì)WINDOWS應(yīng)用程序的時(shí)候,不管使用什么開發(fā)工具,用戶界面的主要構(gòu)成元素是“窗體”,我們預(yù)先設(shè)計(jì)好承擔(dān)不同任務(wù)的窗體,然后在適當(dāng)?shù)臅r(shí)候把他們彈出來,任務(wù)完成后把他們關(guān)掉。這樣就基本完成了用戶界面的流程控制。

而ASCX是類似可嵌入到網(wǎng)頁中的UI單元。我們可以通過編寫HTML來開發(fā)一個(gè)ASCX。這只是ASP.NET框架所提供的一種機(jī)制。我們可以把ASCX做為FORM,像操作WINDOWS FORMS一樣操作網(wǎng)頁中的ASCX,來完成我們的UI邏輯。

由于ASCX可以嵌入頁面中,這就使得最大程度重用頁面構(gòu)圖提供了可能性。我們可以把ASPX頁面當(dāng)作ASCX的容器。ASPX僅包含UI邏輯。更復(fù)雜的業(yè)務(wù)上的邏輯由ASCX承擔(dān)。甚至ASCX僅承載數(shù)據(jù)。(在我的實(shí)際經(jīng)驗(yàn)中,我總是設(shè)計(jì)兩類ASCX。一類是數(shù)據(jù)類,僅以一定格式顯示數(shù)據(jù),不承擔(dān)業(yè)務(wù)邏輯;另外一種是事務(wù)型,用來完成某種操作。)ASPX控制其中的各個(gè)ASCX交互顯示隱藏,由此完成流程控制。

實(shí)現(xiàn)的障礙在哪里?提供ASCX的主要目的是隱藏其中的邏輯,并且提供一定程度上的重用性。但是ASCX內(nèi)部的邏輯并不能和其容器直接交流。也就是說ASCX對(duì)外界是一無所知的。承載ASCX的容器(可能是一個(gè)ASPX頁面或者另一個(gè)ASCX)可以很方便的控制他的顯示,隱藏,但是容器卻不知道什么時(shí)候關(guān)閉他。在流程完成后,ASCX無法直接調(diào)用容器的方法是自己關(guān)掉。

關(guān)鍵性的技巧就是讓ASCX可以向外引發(fā)事件。只要ASCX需要變動(dòng)自己的UI狀態(tài),就以一定的事件通知容器。而不用管容器如何處理。而容器可以很容易捕獲控件的事件而最初相應(yīng)處理。這樣就給我們提供了一種指導(dǎo)性的模式。

作者的設(shè)計(jì)。一般而言, 我給表現(xiàn)層的ASPX和ASCX都至少抽象一個(gè)基類。基類里包含所有ASCX都需要的內(nèi)容。有安全方面的,有系統(tǒng)配置方面的。對(duì)于本文所論述的內(nèi)容,我使所有ASCX都可以引發(fā)三種事件,分別代表ASCX生命周期的各個(gè)階段,他們是:

MissionStart:事務(wù)開始,代表控件最初狀態(tài)。
MissionAbort:事務(wù)中止,用戶的操作取消。需要返回原界面。
MissionEnd:事務(wù)結(jié)束, 用戶的操作完成,需要進(jìn)一步處理。

這三個(gè)事件都沒有任何參數(shù),他們僅僅包含了界面邏輯,和業(yè)務(wù)邏輯沒有關(guān)系。 這樣我們可以在用戶沒有進(jìn)行有結(jié)果的操作,并且需要返回原界面時(shí)引發(fā)MissionAbort事件,在用戶操作完成,需要進(jìn)一步處理時(shí)引發(fā)MissionEnd事件。(MissionStart我還從來沒有應(yīng)用到, 但我想預(yù)留這么一個(gè)事件是必要的。)

[有關(guān)源代碼]
以下源代碼摘自UserControlBase.cs 該類繼承自System.System.Web.UI.UserControl
??/// <summary>
??/// 關(guān)鍵系統(tǒng)事件: 事務(wù)開始. ASCX生命周期開始.
??/// </summary>
??public event System.EventHandler MissionStart;

??/// <summary>
??/// 關(guān)鍵系統(tǒng)事件: 事務(wù)中止. 未進(jìn)行到事件最終狀態(tài). ASCX關(guān)閉但操作未完成.
??/// </summary>
??public event System.EventHandler MissionAbort;

??/// <summary>
??/// 關(guān)鍵系統(tǒng)事件: 事務(wù)完成. 既定操作完成. ASCX被關(guān)閉, 通知容器向下進(jìn)行.
??/// </summary>
??public event System.EventHandler MissionEnd;

??/// <summary>
??/// 引發(fā)MissionStart事件
??/// </summary>
??protected void RaiseMissionStart()
??{
???if(this.MissionStart != null)
???{
????this.MissionStart(this, new System.EventArgs());
???}
??}

??/// <summary>
??/// 引發(fā)MissionAbort事件
??/// </summary>
??protected void RaiseMissionAbort()
??{
???if(this.MissionAbort != null)
???{
????this.MissionAbort(this, new System.EventArgs());
???}
??}

??/// <summary>
??/// 引發(fā)MissionEnd事件
??/// </summary>
??protected void RaiseMissionEnd()
??{
???if(this.MissionEnd != null)
???{
????this.MissionEnd(this, new System.EventArgs());
???}
??}

ASCX需要從此基類派生. 例如:
public class ComplexSearch : XxxXxx.YyyYyy.UserControlBase
{
...
}


上述ASCX是一個(gè)做組合查詢的UI. 有一個(gè)“取消“命令按鈕. 我們?cè)谌∠粹o的Click事件上做如下命令
This.RaiseMissionAbort();

之后容器捕獲該事件, 在private void InitializeComponent()方法中加上:
this.XxxXxxxx.MissionAbort += new EventHandler(AttributeInsert_MissionAbort);

(注意:以上代碼是+=以后的部分IDE可以自動(dòng)為你完成. 并且自動(dòng)生成復(fù)合編碼約定的方法名):

??private void XxxXxxxx_MissionAbort(object sender, EventArgs e)
??{
???///...(處理過程)
??}

以上僅僅是基類相關(guān)事件的定義以及應(yīng)用范例. 實(shí)際情況也復(fù)雜不到哪里去. 不過除了這些之外, 作者所開發(fā)的項(xiàng)目中, 幾乎每個(gè)ASCX都有著異常豐富的特性. 有著較高的可重用性/靈活性和獨(dú)立性.

[幾點(diǎn)與主題無關(guān)的原則]
1. 盡量抽象一些公共特性到基類
2. 盡量分離邏輯. 公開足夠的特性(Properties), 方法, 事件.
3. 設(shè)計(jì)上多用一天, 可以減少幾天的編碼及維護(hù)工作量. 并且可為后繼的工作帶來便利.

[結(jié)束]
本著拋磚引玉的想法,本文僅僅討論了給ASCX加上三個(gè)事件。想法簡(jiǎn)單明晰,但在一定程度上反映了”架構(gòu)“上的一些思想。

轉(zhuǎn)載于:https://www.cnblogs.com/xchunyu/archive/2004/04/05/5252.html

總結(jié)

以上是生活随笔為你收集整理的让WEB FORM更像WINDOWS FORM: 控制窗体事件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。