一、概述:
與WEB窗體頁相同,程式員可以使用任何文本編輯器創作使用者控件,或者使用代碼隐藏類開發使用者控件。此外,與WEB窗體頁一樣,使用者控件可以在第一次請求時被編譯并存儲在伺服器記憶體中,進而縮短以後請求的響應時間。
但與WEB窗體頁不同的是,不能獨立地請求使用者控件,使用者控件必須包括在WEB窗體頁内才能使用。
使用者控件減少了代碼的重用性,一個使用者控件就是一個簡單的ASP.NET頁面,不過他是包含在另一個ASP.NET頁面的,
使用者控件檔案有如下特點:
- 擴充名為:.ascx。
- 使用者控件中沒有“@ page”指令,而是包含“@ Control”指令,該指令對配置及其他的屬性進行定義。
- 使用者控件不能作為獨立檔案運作,而是必須像處理控件一樣,将它們添加到Asp.net頁中。
- 使用者控件中沒有html,body,或form元素,這些元素不許位于宿主中。
二、建立使用者控件
1.先建立一個ASP.NET Web應用程式又見“添加”、點選“建立項”,選擇 Web使用者控件點選添加。
2.可在使用者控件中添加想要使用的控件。
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Content.ascx.cs" Inherits="WebApplication4.Content" %>
<div>
<span></span>
<asp:Label ID="lblTitle" runat="server"></asp:Label>
</div>
3.在使用者控件背景寫入代碼。
public partial class Content : System.Web.UI.UserControl
{
public string hif { set; get; }
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
lblTitle.Text = hif;
}
}
}
【注意】當使用者控件包括在WEB窗體頁中時,此使用者控件中包含的任何ASP.NET伺服器控件的所有屬性和方法都将提升為此使用者控件的公共屬性和方法。
三、使用使用者控件
1、聲明方式使用使用者控件
把用從解決方案管理器将戶控件Content.ascx拉入到需要的頁面,并引用使用者控件中的屬性和方法
在頁面中注冊使用者控件
<%@ Register src="Content.ascx" tagname="Content" tagprefix="uc1" %>
或在Web.config中注冊使用者控件:
<controls>
<add tagPrefix="uc1" src="~/Controls/Content.ascx"" tagName="Content"/>
</controls>
調用使用者控件:
<uc1:Content ID="Content1" runat="server" />
服務端代碼:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Content1.hif = "aaa";
}
}
2、以程式設計方式加載使用者控件
可以使用Page類的LoadControl方法以程式設計方式載入使用者控件。
Content Content2 = (Content)this.LoadControl("Content.ascx");
Content2.hif = "123";
this.Controls.Add(Content2);
3、序列化使用者控件成html
利用使用者控件的轉成字元串傳回到用戶端,使用者ajax請求html内容。
public class ViewManager<T> where T : UserControl
{
private Page m_pageHolder;
public T LoadViewControl(string path)
{
this.m_pageHolder = new Page();
return (T)this.m_pageHolder.LoadControl(path);
}
public string RenderView(T control)
{
StringWriter output = new StringWriter();
control.InitializeUserControl();
this.m_pageHolder.Controls.Add(control);
HttpContext.Current.Server.Execute(this.m_pageHolder, output, false);
return output.ToString();
}
}
ViewManager中隻有兩個方法:LoadViewControl和RenderView。LoadViewControl方法的作用是建立一個Control執行個體并傳回,RenderView方法的作用則就是生成HTML了。這個實作方式的技巧在于使用了一個建立的Page對象作為生成控件的“容器”,而最後其實我們是将Page對象的整個生命周期運作一遍,并且将結果輸出。由于這個空的Page對象不會産生任何其他代碼,是以我們得到的,就是使用者控件生成的代碼了。
ViewManager<Content> load = new ViewManager<Content>();
Content Content2 = load.LoadViewControl("Content.ascx") as Content;
Content2.hif = "123";
string resultHtml = load.RenderView(Content2);
四、使用者控件使用小結
(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窗體頁使用(即使沒有實際聲明的使用者控件标記)。