ASP.NET 2.0 解决了 Code-Behind 需要控件声明同步的问题
這顯然是一個(gè)非常明智而且很早就應(yīng)該實(shí)現(xiàn)的做法,因?yàn)橐呀?jīng)在HTML中聲明為runat="server"的控件,就應(yīng)該算是聲明過(guò),還要在code-behind中同步的用C#代碼再聲明一個(gè)同名控件顯然是違反了《程序員修煉之道》中所謂的DRY(Don't Repeat Yourself)原則。
原本ASP.NET 1.x的編譯模型是編譯站點(diǎn)時(shí)先編譯code-behind部分,然后得到code-behind部分的Page派生類(lèi),等到運(yùn)行時(shí)再編譯aspx部分此事得到code-behind部分的派生類(lèi)(也就是Page的二級(jí)派生類(lèi)),而一旦aspx和code-behind出現(xiàn)控件聲明的不同步那么這個(gè)繼承關(guān)系將出現(xiàn)問(wèn)題。
ASP.NET 2.0的做法就是把a(bǔ)spx和code-behind都看作Page派生類(lèi)的partial class,并且合成編譯,而aspx中所有的控件聲明都將在編譯時(shí)自動(dòng)轉(zhuǎn)換為C#聲明,這樣的好處是只有一層Page派生類(lèi)而且不用同步什么東西,所有東西都是僅聲明一次。不過(guò)有一個(gè)問(wèn)題就是,到底aspx中的聲明是轉(zhuǎn)換為C#的partial class再編譯還是能夠直接編譯呢?轉(zhuǎn)換為C#編譯是很直接的思路,ASP.NET 2.0 的內(nèi)部變化也是說(shuō)原本由VS.NET 2002/2003做的聲明同步工作現(xiàn)在交給ASP.NET Runtime了,但是這樣就有一個(gè)問(wèn)題,如果要開(kāi)發(fā)一種新的ASP.NET語(yǔ)言(例如Delphi for ASP.NET 2.0),那么也就必須建立aspx到該語(yǔ)言的翻譯,這是十分麻煩的事情。但是如果aspx和code-behind分開(kāi)編譯的話,這好像超出了partial class的能力范圍,根據(jù)C# 2.0的規(guī)范,partial class的所有部分必須是同時(shí)編譯的,不可以是增量編譯的,也不可以是跨語(yǔ)言編譯的,而aspx和code-behind都直接編譯的話就需要雙語(yǔ)言編譯,也就需要增量編譯。
ASP.NET 2.0還有一個(gè)很好的地方,就是部署編譯,你能夠把整個(gè)網(wǎng)站都編譯了(包括aspx和code-behind)然后發(fā)布,發(fā)布目標(biāo)的aspx將是一個(gè)僅引用后臺(tái)類(lèi)的控文件,這樣性能最好而且也不用擔(dān)心代碼泄漏(特別是編譯后的dll再混淆一下的話)。不過(guò)因?yàn)閍spx部分也編譯了,所以這樣發(fā)布的網(wǎng)站發(fā)布之后就不能改動(dòng)。而ASP.NET 2.0還提供另一個(gè)極端,就是完全運(yùn)行時(shí)編譯。以前ASP.NET 1.x如果是code-behind的話,code-behind部分就必須在VS.NET里面先編譯,不過(guò)現(xiàn)在ASP.NET 2.0能夠自動(dòng)監(jiān)測(cè)code-behind部分是否有改動(dòng)過(guò)(甚至是/App_Code目錄下的其他非UI邏輯的code),如果有就運(yùn)行時(shí)編譯,這對(duì)于調(diào)試來(lái)說(shuō)是挺方便的,不需要每次調(diào)時(shí)前先在VS.NET里面按Ctrl+Shift+B編譯。
總結(jié)
以上是生活随笔為你收集整理的ASP.NET 2.0 解决了 Code-Behind 需要控件声明同步的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 将BLOG作为输入平台 ……
- 下一篇: [ASP.NET] 限制上传文件类型的