在ASP.NET中使用使用者控制項
最後更新:2017-02-28
來源:互聯網
上載者:User
asp.net|控制項 【摘要】ASP.NET中提供的使用者控制項,可以解決ASP中無法解決的代碼重用問題,更方便了調試工作中的錯誤檢查。本文通過使用者控制項實現方法講解和一個使用者控制項常式的實現,進一步驗證了利用使用者控制項解決代碼重用的可行性和有效性。
【關鍵字】代碼重用、使用者控制項、@Register指令
ASP.NET提供了比傳統ASP更好的代碼分離方案。在傳統的ASP中,要將用Server. Execute執行的ASP檔案或事務對象組件的代碼分離開,一般只能將代碼分離成幾個檔案,然後使用“include”的方法。這種方法將造成記憶體中有多個“include”檔案的複本(檔案每被引用一次就產生一個複本),從而增加了系統的負擔,因此並不可行。使用Server. Execute或許有些改觀,但是不能向正在執行的ASP檔案傳遞附加的查詢串參數。使用組件可能是唯一比較好的做法。在ASP.NET中,除了使用“include”(並不推薦使用)和事務對象組件的方法,還可以使用兩種新技術:code-behind類和WEB使用者控制項。
使用code-behind類可以有效地將用戶端的HTML代碼和伺服器端的事件處理代碼分離開。將這兩部分代碼分離開有利於調試時跟蹤程式,因為那時就不必在實現使用者介面的代碼和事務邏輯代碼之間來回切換。而且,如果項目中使用者介面和交易處理是由不同的小組開發的,那麼使用code-behind類就可以使這兩部分實現獨立調試。利用code-behind類將使用者介面代碼和事務邏輯代碼區分開使得代碼的整合和維護都比較簡便。下面將介紹的使用者控制項,從代碼重用的角度來處理代碼分離問題。
1、使用者控制項簡介
使用者控制項使程式員能夠很容易地跨ASP.NET WEB應用程式劃分和重複使用公用UI功能。與WEB表單頁相同,程式員可以使用任何文字編輯器創作使用者控制項,或者使用程式碼後置類別開發使用者控制項。此外,與WEB表單頁一樣,使用者控制項可以在第一次請求時被編譯並儲存在伺服器記憶體中,從而縮短以後請求的回應時間。但與WEB表單頁不同的是,不能獨立地請求使用者控制項,使用者控制項必須包括在WEB表單頁內才能使用。
與伺服器端包含檔案(SSI)相比,使用者控制項通過訪問由ASP.NET提供的物件模型支援,使程式員具有更大的靈活性。程式員可以對在控制項中聲明的任何屬性進行編程,而不只是包含其他檔案提供的功能,這與其他任何ASP.NET伺服器控制項一樣。
儘管在創作使用者控制項時需要選擇一種語言,但程式員可以將多個使用者控制項包含在用多種語言創作的一個WEB表單頁中。例如,可以用Visual Basic.NET創造一個使用者控制項,匯入來自XML檔案的資料,再用C#建立另一個使用者控制項,該控制項包含一個訂單表單,然後在同一個WEB表單頁中包括這兩個控制項。
此外,可以獨立於包含使用者控制項的WEB表單頁中除該控制項以外的部分來緩衝該控制項的輸出。這一技術稱作片段快取,適當地使用該技術能夠提高網站的效能。例如,如果使用者控制項包含提出資料庫請求的ASP.NET伺服器控制項,但該頁的其餘部分只包含文本和在伺服器上啟動並執行簡單代碼,則程式員可以對使用者控制項執行片段快取,以改進應用程式的效能。
2、建立使用者控制項
可以通過使用文本或HTML編輯器以聲明方式建立使用者控制項。使用者控制項聲明文法與建立WEB表單頁所採用的文法十分類似;兩者的主要差別在於使用者控制項在內容周圍不包括<html>、<body>和<form>元素。在包含使用者控制項的WEB表單頁中包括這些元素。
使用者控制項可以像文字檔一樣簡單,或者它們可以包含其他ASP.NET伺服器控制項。以下過程簡要介紹了一個可包括在應用程式多個頁上的簡單登入表單。
在代碼聲明塊中公開屬性、事件處理常式以及要包括在使用者控制項功能中的其他任何代碼。在使用使用者控制項的屬性時有兩個選擇。首先,可以定義使用者控制項的新屬性並操作它們。其次,可以操作構成使用者控制項的伺服器控制項的屬性。例如,在使用者控制項中聲明Textbox WEB伺服器控制項,並向它提供一個ID為PASSWORD,則可以通過使用PASSWORD. Text文法來操作其Text屬性。
【注意】當使用者控制項包括在WEB表單頁中時,此使用者控制項中包含的任何ASP.NET伺服器控制項的所有屬性和方法都將提升為此使用者控制項的公用屬性和方法。
步驟1:以下程式碼範例宣告對應到步驟1中代碼的文字框的UserId和Password屬性。可以通過聲明或編程的方式,在任何包含此使用者控制項的WEB表單頁中操作這些屬性。
Public MustInherit Class Loginform
Inherits System.Web.UI.UserControl
Protected WithEvents User As System.Web.UI.WebControls.TextBox
Protected WithEvents Pass As System.Web.UI.WebControls.TextBox
Protected WithEvents Button1 As System.Web.UI.WebControls.Button
#Region " Web Form設計器產生的程式碼 "
'該調用是 Web Form設計器所必需的。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
'CODEGEN: 此方法調用是 Web Form設計器所必需的
'不要使用代碼編輯器修改它。
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此處放置初始化頁的使用者代碼
End Sub
Public Property UserId() As [String]
Get
Return User.Text
End Get
Set(ByVal Value As [String])
User.Text = Value
End Set
End Property
Public Property Password() As [String]
Get
Return Pass.Text
End Get
Set(ByVal Value As [String])
Pass.Text = Value
End Set
End Property
End Class
步驟2:建立該使用者控制項顯示的UI元素。以下代碼建立與來自步驟1的代碼進行互動的登入表單。
【注意】將此使用者控制項包括在Web表單頁中時,需要在@Register指令的Src屬性中包括此檔案名稱以及該檔案的路徑。
<%@ Control Language="vb" AutoEventWireup="false" Codebehind="Logonform.ascx.vb" Inherits="logintest.Logonform" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %>
<TABLE cellSpacing="15">
<TR>
<TD><B>使用者姓名: </B></TD>
<TD><ASP:TextBox id="User" runat="server"></ASP:TextBox></TD>
</TR>
<TR>
<TD><B>使用者口令: </B></TD>
<TD><ASP:TextBox id="Pass" runat="server" TextMode="Password"></ASP:TextBox></TD>
</TR>
<TR>
<TD></TD>
<TD><ASP:Button id="Button1" runat="server" Text="登入" BorderStyle="Groove"></ASP:Button></TD>
</TR>
</TABLE>
3、調用使用者控制項
只有當包括在WEB表單頁中時,使用者控制項才可以工作。當一個請求到達某一頁而該頁包含使用者控制項時,該使用者控制項將經曆任何伺服器控制項所要經曆的所有處理階段。
在 WEB 表單頁中包括使用者控制項的方法很簡單。
在要包含使用者控制項的 WEB 表單頁中,聲明一個@Register指令,該指令包括:
tagprefix屬性,該屬性將首碼與使用者控制項相關聯。此首碼將包括在使用者控制項元素的開始標記中。
tagname屬性,該屬性將名稱與使用者控制項相關聯。此名稱將包括在使用者控制項元素的開始標記中。
Src屬性,該屬性定義要包括在WEB表單頁中的使用者控制項檔案的虛擬路徑。
例如,以下代碼將註冊在檔案LoginForm.ascx中定義的使用者控制項。該控制項還被指定有標記首碼Acme和標記名稱Login。
<%@ Register TagPrefix="Acme" TagName="LoginForm" Src=".\LoginForm.ascx" %>
使用自訂伺服器控制項文法在HtmlForm伺服器控制項的開始標記和結束標記之間 (<form runat=server></form>) 聲明該使用者控制項元素。例如,要聲明在上一步匯入的控制項,使用以下文法。
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="logintest.aspx.vb" Inherits="logintest.WebForm1"%>
<%@ Register TagPrefix="Acme" TagName="LoginForm" Src=".\LoginForm.ascx" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title>WebForm1</title>
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.0">
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<Acme:LoginForm id=" LoginForm " runat="server"/>
</form></BODY>
</HTML>
【注意】無論在WEB表單頁上包括了多少個ASP.NET伺服器控制項(使用者控制項和其他任何控制項),都應只在WEB表單頁上包括一個HtmlForm伺服器控制項。此控制項的開始和結束標記之間應包括所有伺服器控制項。
通過上面的程式,在logintest.aspx頁中調用了名為loginform.ascx的使用者控制項,結果如下圖所示:
4、使用者控制項使用小結
(1)使用者控制項使開發人員能夠使用編寫WEB表單頁的相同編程技巧輕鬆地定義自訂控制項。 作為約定,用.ascx副檔名指示這樣的控制項。這樣可以確保使用者控制項檔案不能作為獨立的WEB表單頁執行。
(2)使用者控制項通過Register指令包括在另一WEB表單頁中,該指令指定TagPrefix、TagName和Src location。
(3)註冊了使用者控制項後,可以像普通的伺服器控制項那樣將使用者控制項標記放置在WEB表單頁中(包括runat="server"屬性)。在包含WEB表單頁中將使用者控制項的公用欄位、屬性和方法提升為該控制項的公用屬性(標記屬性)和方法。
(4)使用者控制項參與每個請求的整個執行生存期,並且可以處理自己的事件,封裝來自包含WEB表單頁的一些頁邏輯。
(5)使用者控制項不應包含任何表單控制項,而應依靠其包含WEB表單頁在必要時包括表單控制項。
(6)可以使用System.WEB.UI.Page類的LoadControl方法以編程方式建立使用者控制項。使用者控制項的類型由ASP.NET運行庫決定,遵循約定檔案名稱_副檔名。
(7)只有當為使用者控制項包括了Register指令時,使用者控制項的強型別才能由包含WEB表單頁使用(即使沒有實際聲明的使用者控制項標記)。
5、結束語
在編寫WEB應用程式時,如果將可能重複出現的元素都用使用者控制項來實現,那將大大減少維護代碼的代價。而且在修改代碼時,記得修改一段代碼卻忘了修改另一段同樣代碼的情況也將不存在了。代碼越短,出現錯誤的因素越少,出現錯誤的可能性就越小。