20110612 DiscuzNT代码研究(3)
????? PDF下載:http://dl.dbank.com/c0d4ygs82d
1.?????? 說明
本文主要討論
1)??? ASP.NET的頁面隱藏模型
2)??? 通過頁面隱藏模型重寫Discuz.Web-install-index.aspx頁面
2.?????? Asp.Net頁面隱藏模式
2.1.????? 創(chuàng)建index_cfq.aspx的Web窗體頁面
選擇install文件夾à右鍵à選擇“添加-新建項”à選擇“Web窗體”,輸入“index_cfq.aspx”
2.2.????? index_cfq.aspx頁面代碼
?????? 我們主要關注第1行,第一行說明:
1)??? 本頁面采用的語言“C#”
2)??? 本頁面的事件采用自動匹配:AutoEvenWireUp=”True”
3)??? 本頁面采用代碼隱藏模型:CodeBehind=”index_cfq.asp.cs”
4)??? 本頁面編譯時生成的類將繼承Discuz.Web.install.index_cfq
2.3.????? @Page指令的AutoEvenWireUp屬性
AutoEvenWireUp屬性用于指示“頁面的事件是否自動匹配”。
當AutoEvenWireUp=true時,表示頁面啟動事件自動匹配。
2.3.1.????? 事件類型
這里我們談到事件,我們把事件適當區(qū)分一下:
1)??? 頁事件:即Page頁面的事件
2)??? 控件事件:即控件上的事件,比如aspx頁面上有個Button控件,那么Button控件的事件成為控件事件。
AutoEvenWireUp是針對頁事件而言的。
2.3.2.????? 事件與方法的綁定
事件與事件處理方法的綁定,在.NET中是通過“委托”實現(xiàn)的,在ASP.NET中,有幾種方式可以綁定事件方法。
1)??? 委托:在C#代碼中實現(xiàn)
| this.button1.Click += new System.EventHandler(this.button1_Click); |
2)??? 控件標記
| <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" /> |
3)??? 基于方法命名約定的方法
一般指頁事件的方法,這種綁定需要設置AutoEvenWireUp=true,其他地方不用指定方法與事件的關聯(lián),系統(tǒng)會自動查找按照“命名約定的方法”(Page_事件名稱),然后即可啟動事件。當然方法的參數(shù)必須與事件委托一致。
| protected void Page_Load(object sender, EventArgs e) |
2.4.????? 關于頁面隱藏模型
先看看下圖,當然下圖不是標準的UML圖,只是為了解釋一下而已。
本圖是在頁面隱藏模型下在Web服務器編譯后的類圖信息。
?????? 可以通過VS的類視圖可以看得比較清楚
??????
?????? 我們對整個過程稍微介紹一下。
當我們建立一個index_cfq的web窗體,VS自動幫忙創(chuàng)建了幾個文件:
1)??? index_cfq.aspx
2)??? index_cfq.aspx.cs(index_cfq.aspx.designer.cs)
n???????? index_cfq.aspx
主要是aspx頁面信息,可以包括C#代碼,服務器控件信息,HTML標記,CSS,JavaScript等等內(nèi)容。
?????????????
n???????? index_cfq.aspx.cs(index_cfq.aspx.designer.cs)
index_cfq.aspx.cs主要放一些C#源代碼,一般是一些方法,當然還可以有很多內(nèi)容弄個,但是不包含aspx頁面上的服務器控件定義信息(在index_cfq.aspx.designer.cs定義)。
其中index_cfq.aspx.designer.cs主要是放一些服務器控件的定義內(nèi)容。
?????? 其中index_cfq.aspx文件編譯后,實際上會產(chǎn)生兩個類,一個是index_cfq的部分類,與index_cfq.aspx.cs文件編譯后產(chǎn)生的index_cfq部分類一起構成index_cfq完整類。
??????
?????? 同時index_cfq.aspx還產(chǎn)生一個類,即index_cfq_aspx類,此類繼承自index_cfq類,這也是
中指定 Inherites="Discuz.Web.install.index_cfq"繼承的意思。
?????? 如果把Inherites="Discuz.Web.install.index_cfq"改為
Inherites="Discuz.Web.install.index_cfq_cfq",則在運行時會提示如下錯誤:
然后觀察類視圖,即會發(fā)現(xiàn),實際上系統(tǒng)仍自動創(chuàng)建一個index_cfq_cfq的類,只是這個類因為在其他頁面沒有指定繼承Page,所以默認繼承Object,但是對于ASP.NET頁面必須繼承Page,所以在運行提示錯誤,說明該類型不是繼承與Page的錯誤。
然后我們Inherites="Discuz.Web.install.index_cfq"該回來,
然后把CodeBehind="index_cfq.aspx.cs"刪除或者改為
CodeBehind="index_cfq_cfq.aspx.cs"
瀏覽程序,這是我們發(fā)現(xiàn)程序正常運行。
也就是說,實際上當我們編譯了dll文件了,實際上我們可以不用CodeBehind這個東西,我們直接用Inherites指名我們要繼承的類即可。
我再做一個實驗。
1)????? 把“index_cfq.aspx.cs”改名為“index_cfq_cfq.aspx.cs”
2)????? 把“index_cfq.aspx.designer.cs”改名為“index_cfq_cfq.aspx.designer.cs”
這是會發(fā)現(xiàn)以下現(xiàn)象:
1)????? index_cfq_cfq.aspx.designer.cs自動關聯(lián)到index_cfq_cfq.aspx.cs。這個應該是VS的機制。
2)????? index_cfq.aspx底下的兩個文件會感嘆號,可以刪除了,所以下面圖看不到。
之所有有感嘆號,是因為在項目中有包含此兩個文件,但是實際文件已經(jīng)不存在了,所以提示感嘆號。
??????
?????? 然后選擇那兩文件,包含到項目中。
??????
然后重新生成網(wǎng)站,運行index_cfq.aspx,正常!
| 這里需要注意兩個細節(jié): 1)??? 如果以上兩文件為包含到項目中,則無法正常運行,會提示類不存在。 2)??? 如果未包含文件,但是通過CodeFile指定CS文件,也是可以運行的,但是發(fā)布網(wǎng)站時,必須一同發(fā)布源代碼哦!(用CodeBehind也是不行的) |
3.?????? 修改index.aspx頁面為頁面隱藏模式
既然我們立即了頁面隱藏模式的原理,我們現(xiàn)在嘗試把index.aspx頁面修改為頁面隱藏模式。
1)??? 建立一個index.aspx.cs文件,在其中創(chuàng)建一個index的類
2)??? 然后把<script></script>的代碼搬移過來(可以不刪除index中的代碼,注釋掉即可)。
3)??? 在index.aspx.cs文件的Page指令中添加如下內(nèi)容:
4)??? 注釋掉“Page_Lode”方法中的頁面跳轉代碼,以便測試
5)??? 經(jīng)過測試,調(diào)試成功。
(本文結束)
轉載于:https://www.cnblogs.com/wesoft/archive/2011/06/12/2079200.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的20110612 DiscuzNT代码研究(3)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Android开发从零开始》——29.
- 下一篇: 【转】vim中将tab自动转换成空格