全局定義頁特定配置設置,如配置文件范圍內的頁和控件的 ASP.NET 指令。能配置當前Web.config目錄下的所有頁面的設置。
<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> <add assembly="指定程序集的名稱" namespace="指定與標記前綴關聯的命名空間" src="指定文件的名稱" tagName="指定頁中要使用的控件的名稱並且還需要設置 src 屬性" tagPrefix="指定映射到源文件或命名空間和程序集的標記前綴"/> </controls> <namespaces> <add namespace="指定要在預編譯期間使用的命名空間" /> </namespaces> <tagMapping> <add mappedTagType="指定 tagType 要重新映射到的類型的名稱,新的控件名稱" tagType="指定要重新映射的標記的類型的名稱。原有ASP.NET控件的名稱" /> </tagMapping> </pages>
與Pages上的部分設置可以在單獨頁面上通過@Page指令進行設置,Pages配置節的屬性是@Page指令的子集,兩者的屬性說明則參考MSDN《pages 元素(ASP.NET 設置架構)》和《@ Page》。新建一個aspx頁面,就會看到頁面上的@Page命令
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="FastDoge.Study.WebForm2" %>
他們的作用是
Language:指定在對頁中的所有內聯呈現(<% %> 和 <%= %>)和代碼聲明塊進行編譯時使用的語言。值可以表示任何 .NET Framework 支持的語言,包括 Visual Basic、C# 或 JScript。每頁只能使用和指定一種語言。
AutoEventWireup:指示頁的事件是否自動綁定。如果啟用了事件自動綁定,則為 true;否則為 false。默認值為 true。
CodeBehind:指定包含與頁關聯的類的已編譯文件的名稱。該屬性不能在運行時使用。
Inherits:定義供頁繼承的代碼隱藏類。它可以是從 Page 類派生的任何類。它與 CodeFile 屬性(包含指向代碼隱藏類的源文件的路徑)一起使用。
AutoEventWireup的具體作用是,把隱藏類中的頁事件的綁定方法(最常見的是Page_Load)自動綁定上去,因為通篇沒看到給Page類顯式綁定事件的代碼。假如將其設置成false,Page_Load方法不會執行。
pages的子節點有三個:controls,namespaces和tygMapping
Namespaces與@Import指令
用於指定頁面上的代碼所需要的命名空間,實際上是給即時編譯的編譯器添加指定的命名空間
例如在webform中添加如下代碼
<form id="form1" runat="server"> <div> <script runat="server"> protected void Page_Load(object sender, EventArgs e) { Thread.Sleep(6000); this.lb1.Text = "123 " + File.Exists(@"E:\123.txt"); } </script> <asp:Label ID="lb1" runat="server" /> </div> </form>
打開頁面則會發現預編譯出錯了
可以在web.config中添加pages配置節
<pages> <namespaces> <add namespace="System.Threading"/> <add namespace="System.IO"/> </namespaces> </pages>
這樣運行就正常了
同樣也可以在頁面上使用@Import命令
<%@ Import Namespace="System.IO" %>
同樣達到效果,一般情況下建立項目后,web.config的pages/namespaces下添加了若干個命名空間,所以.NET 類庫里面的一些類能被在頁面上調用,到后來的MVC里面同樣有添加
但在MVC的Razor語法中,新增了@using語句,@Import使用變少了
Controls與@Register指令
定義標記前綴所在的 register 指令和命名空間的集合,我認為是用於指定用戶控件和自定義控件。
在本次實踐中,鄙人寫了一個簡單的用戶控件MyLogin。
把它直接拖入WebForm2頁面中,自動生成的代碼如下所示
單純在單個頁面使用的話,引入非ASP.NET控件時需要用@Register聲明控件的前綴和標簽名,以及關聯的控件文件。如果不想在每個頁面都如此聲明,則可以在web.config中添加配置
關鍵看controls那一節。此時清除頁面上的@Register命令也不會出錯。
注意:需要在web.config中聲明控件的,控件文件*.ascx不能放在web.config的同層目錄,否則運行則會報錯。
controls 元素定義標記前綴所在的 register 指令和命名空間的集合。 此元素對應於 ASP.NET 頁上的 @ Register 指令。 使用 @ Register 指令可以指定用戶控件的標記前綴。
標記前綴將 ASP.NET 中的命名空間與 COM 控件和用戶控件正常工作所需的程序集和命名空間相關聯。 下面的信息在配置 controls 元素時很有用:
- 如果應用於用戶控件,則必須定義 add 子元素的 tagPrefix、tagName 和 source 特性。
- 如果應用於自定義控件,則必須定義 add 子元素的 tagPrefix、namespace 和 assembly 特性。 如果控件位於應用程序代碼目錄中,則不需要 assembly 特性。
可以使用相同的 tagPrefix 值來映射到多個程序集或命名空間。
在以下情況中,使用 @ Register 指令:
- 以聲明方式將自定義服務器控件添加到網頁、用戶控件、母版頁或外觀文件(請參見 ASP.NET Themes Overview)。
- 以聲明方式將用戶控件添加到網頁、用戶控件、母版頁或外觀文件。
使用 @ Register 指令引用控件時,可以將控件的代碼放在以下位置:
- 作為應用程序的 App_Code 文件夾的源代碼,將在運行時在該文件夾中動態編譯代碼。 在開發過程中可以使用這一便捷選項。 如果您選擇此選項,則不必在 @ Register 指令中使用 assembly 特性。
- 作為應用程序的 Bin 文件夾中的編譯的程序集。 這是一個針對部署的 Web 應用程序的通用選項。
- 作為全局程序集緩存 (GAC) 中編譯和簽署的程序集。 這是一個針對希望在多個應用程序之間共享編譯的控件的通用選項。 通過向 assembly 特性分配正在識別的字符串,可以引用 GAC 中的控件。 此字符串指定有關控件的所需詳細信息,包括控件的完全限定類型名、版本、公鑰標記和區域性。 下面的虛擬字符串闡明了對 GAC 中的自定義控件的引用:
<%@ Register tagprefix="custom"
namespace="Mycompany.namespace"
assembly="Mycompany.namespace.control, Version=1.2.3.4,
PublicKeyToken=12345678abcdefgh, Culture=neutral" %>
有關引用程序集的更多信息,請參見compilation 的 assemblies 的 add 元素(ASP.NET 設置架構)。
對於聲明性用戶控件,請使用 tagname、tagprefix 和 src 特性。 在頁中聲明控件時,前兩個屬性總是以冒號分隔對 (tagprefix:tagname) 的形式一起使用。 可以將多個命名空間映射到同一 tagname,如以下示例所示:
<% @Register tagprefix="tag1" namespace="MyNamespace1"/>
<% @Register tagprefix="tag1" namespace="MyNamespace2"/>
src 特性值既可以是相對路徑,也可以是從應用程序的根目錄到用戶控件源文件的絕對路徑。 為方便使用,建議使用相對路徑。 例如,假設將應用程序的所有用戶控件文件存儲在應用程序根目錄的子目錄 \Usercontrol 中。 若要包括 Usercontrol1.ascx 文件中的用戶控件,請在 @ Register指令中包含以下內容:
Src="~\usercontrol\usercontrol1.ascx"
代字號 (~) 字符表示應用程序的根目錄。
當包含已經編譯為 .dll 文件供應用程序使用的自定義服務器控件時,請將 tagprefix 特性與 assembly 和 namespace 特性一起使用。 如果沒有包含 namespace 特性,或者為其分配了一個空字符串 (""),則會出現分析器錯誤。
tagMapping
定義一個標記類型的集合,這些標記類型在編譯時重新映射為其他標記類型。通過下面的例子就明白tagMapping的作用了。首先添加了一個Login控件
然后開始更改,添加一個類FDLogin去繼承Login控件,重寫Render方法
1 protected override void Render(HtmlTextWriter writer) 2 { 3 writer.BeginRender(); 4 5 writer.RenderBeginTag("h1"); 6 writer.Write("hello world"); 7 writer.RenderEndTag(); 8 writer.WriteBreak(); 9 10 writer.Write(@"<div> 11 Id:<input type=""text"" name=""loginId"" /> 12 </div> 13 <div> 14 Password:<input type=""password"" name=""password"" /> 15 </div> 16 <div> 17 <input type=""reset"" value=""Reset"" /> 18 <input type=""submit"" value=""login"" /> 19 <input type=""button"" value=""Regist"" /> 20 </div>"); 21 writer.EndRender(); 22 }
接着在web.config中添加
這樣就把Login控件給玩壞,在aspx頁面中添加的asp:Login控件全部變成經本人擴展后的FDLogin控件模樣。在不改任何頁面代碼的情況下運行
在這次更改控件由於不太會使用HtmlTextWriter,所以很挫地使用了Wirte方法直接寫html代碼,應該上網看看其他控件的源碼才對。瀏覽了一下源碼,控件的Render操作實際上也是在一個Adapter中進行。但這個Adapter就不是System.Web.Mobile下面的,是System.Web下的。