Page,我想每個(gè)ASP.NET開發(fā)人員對(duì)它應(yīng)該都是比較熟悉的。
這次的博客我就打算專門談?wù)勊?。不過呢,我不打算說 在Page中使用控件的一些話題,也不會(huì)說Page的生命周期的相關(guān)話題,因?yàn)槲艺J(rèn)為這些話題被人談?wù)摰拇螖?shù)實(shí)在是太多了,尤其是市面上的ASP.NET的書籍,都會(huì)比較喜歡這些話題。
我不喜歡重復(fù),因此今天我只想談些人家不談的那點(diǎn)事,但我認(rèn)為它們?nèi)匀缓苤匾?/p>
一些重要的Page指令
雖然Page公開了很多屬性,讓我們可以在運(yùn)行時(shí)調(diào)整它的狀態(tài)與行為,但是,還有些重要的參數(shù)卻是以“指令”方式提供的,需要在設(shè)計(jì)時(shí)就指定。
下面是我整理的一些我認(rèn)為 比較重要并且經(jīng)常需要使用的指令:

web.config的全局設(shè)置
前面我介紹了一些常用的Page指令,考慮到方便性,ASP.NET還允許我們?cè)趙eb.config中為一些常用的指令配置默認(rèn)值。下面我就一些常用的場(chǎng)景來說明這些全局配置的方便性。
1. 通常,我在創(chuàng)建一個(gè)網(wǎng)站項(xiàng)目時(shí),肯定會(huì)決定不使用ViewState和Session的。那么如果為每個(gè)頁面設(shè)置EnableViewState,EnableSessionState指令屬性,那就顯得太麻煩了,而且還容易遺漏。此時(shí),我們可以直接在web.config中為這些參數(shù)指定一個(gè)全局的默認(rèn)值: - <pages enableViewState="false" enableSessionState="false"></pages>
-
補(bǔ)充說明一下:全局禁用Session的徹底方法是把Session對(duì)應(yīng)的HttpModule從httpModules列表中移除。
web.config允許我們?cè)O(shè)置Page默認(rèn)參數(shù)的具體配置節(jié)如下: - <pages
- buffer="[True|False]"
- enableEventValidation="[True|False]"
- enableSessionState="[True|False|ReadOnly]"
- enableViewState="[True|False]"
- enableViewStateMac="[True|False]"
- smartNavigation="[True|False]"
- autoEventWireup="[True|False]"
- pageBaseType="typename, assembly"
- userControlBaseType="typename"
- validateRequest="[True|False]"
- masterPageFile="file path"
- theme="string"
- styleSheetTheme="string"
- maxPageStateFieldLength="number"
- compilationMode="[Always|Auto|Never]"
- pageParserFilterType="string"
- viewStateEncryptionMode="[Always|Auto|Never]"
- maintainScrollPositionOnPostBack="[True|False]"
- asyncTimeout="number"
- >
- <controls>...</controls>
- <namespaces>...</namespaces>
- <tagMapping>...</tagMapping>
- </pages>
2. 為了代碼重用,設(shè)計(jì)用戶控件也是很常用的方法。
我們可以使用 @ Register指令 在頁面注冊(cè)需要使用的UserControl或者WebControl。然而,有些控件比較通用,許多頁面都會(huì)使用它,那么就不要再使用 @ Register指令了,可以在web.config中統(tǒng)一注冊(cè)。例如: - <pages>
- <controls>
- <add tagPrefix="fish" tagName="MainMenu" src="~/Controls/MainMenu.ascx" />
- <add tagPrefix="fish" tagName="PageHeader" src="~/Controls/PageHeader.ascx" />
- </controls>
- </pages>
有了這個(gè)定義后,我就可以在任何頁面中直接使用: - <fish:PageHeader runat="server" ID="PageHeader1" />
3. 對(duì)于喜歡使用頁面內(nèi)聯(lián)代碼的人來說,可能經(jīng)常需要使用自己定義的類型。如果這些類型定義在某個(gè)命名空間中,那么就需要在內(nèi)聯(lián)代碼中采用完整命名空間的寫法。雖然這樣做沒有什么問題,但就是麻煩,于是,我們可以在頁面中使用 @ Import指令 來導(dǎo)入我們需要使用的命名空間,但是這個(gè)指令每次只能導(dǎo)入一個(gè)命名空間,而且每個(gè)頁面還得重復(fù)導(dǎo)入,顯然不夠方便。
為了方便使用一些常用的命名空間,我們可以在web.config中統(tǒng)一指定,例如: - <pages>
- <namespaces>
- <add namespace="MyMVC" />
- <add namespace="WebSiteCommonLib" />
- <add namespace="WebSiteModel" />
- </namespaces>
- </pages>
這樣設(shè)置后,所有頁面就可以直接使用這些命名空間下的類型了。
不知道有些人想過:為什么在頁面中使用某些微軟提供的類型就不需要導(dǎo)入命名空間?
答案是:其實(shí)ASP.NET已經(jīng)將一些微軟認(rèn)為常用的命名空間在web.config中配置好了: - <pages>
- <namespaces>
- <add namespace="System"/>
- <add namespace="System.Collections"/>
- <add namespace="System.Collections.Specialized"/>
- <add namespace="System.Configuration"/>
- <add namespace="System.Text"/>
- <add namespace="System.Text.RegularExpressions"/>
- <add namespace="System.Web"/>
- <add namespace="System.Web.Caching"/>
- <add namespace="System.Web.SessionState"/>
- <add namespace="System.Web.Security"/>
- <add namespace="System.Web.Profile"/>
- <add namespace="System.Web.UI"/>
- <add namespace="System.Web.UI.WebControls"/>
- <add namespace="System.Web.UI.WebControls.WebParts"/>
- <add namespace="System.Web.UI.HtmlControls"/>
- </namespaces>
- </pages>
4. 現(xiàn)在,有越來越多的人為了方便而使用擴(kuò)展方法。使用擴(kuò)展方法的好處是:可以讓我們不去關(guān)心這些擴(kuò)展方法定義在那個(gè)類中,只要在支持?jǐn)U展方法的對(duì)象上調(diào)用就可以了,就像下面的代碼這樣: - 當(dāng)前用戶已登錄,登錄名:<%= Context.User.Identity.Name.HtmlEncode() %>
然而,在頁面中使用擴(kuò)展方法時(shí),也必須先導(dǎo)入擴(kuò)展方法的定義類的命名空間。
因此,為了方便,我們可以在web.config中為我們定義的擴(kuò)展方法導(dǎo)入相應(yīng)的命名空間: - <pages>
- <namespaces>
- <add namespace="FishDemoCodeLib" />
- </namespaces>
- </pages>
|