ASP.NET中使用用戶控件
一、概述:
與WEB窗體頁相同,程序員可以使用任何文本編輯器創(chuàng)作用戶控件,或者使用代碼隱藏類開發(fā)用戶控件。此外,與WEB窗體頁一樣,用戶控件可以在第一次請求時被編譯并存儲在服務(wù)器內(nèi)存中,從而縮短以后請求的響應(yīng)時間。
但與WEB窗體頁不同的是,不能獨立地請求用戶控件,用戶控件必須包括在WEB窗體頁內(nèi)才能使用。
用戶控件減少了代碼的重用性,一個用戶控件就是一個簡單的ASP.NET頁面,不過他是包含在另一個ASP.NET頁面的,
用戶控件文件有如下特點:
擴(kuò)展名為:.ascx。
用戶控件中沒有“@ page”指令,而是包含“@ Control”指令,該指令對配置及其他的屬性進(jìn)行定義。
用戶控件不能作為獨立文件運行,而是必須像處理控件一樣,將它們添加到Asp.net頁中。
用戶控件中沒有html,body,或form元素,這些元素不許位于宿主中。
二、創(chuàng)建用戶控件
1.先創(chuàng)建一個ASP.NET Web應(yīng)用程序又見“添加”、點擊“新建項”,選擇 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; } } }
【注意】當(dāng)用戶控件包括在WEB窗體頁中時,此用戶控件中包含的任何ASP.NET服務(wù)器控件的所有屬性和方法都將提升為此用戶控件的公共屬性和方法。
三、使用用戶控件
1、聲明方式使用用戶控件
把用從解決方案管理器將戶控件Content.ascx拉入到需要的頁面,并引用用戶控件中的屬性和方法
在頁面中注冊用戶控件
<%@ Register src="Content.ascx" tagname="Content" tagprefix="uc1" %>
或在Web.config中注冊用戶控件:
<controls> <add tagPrefix="uc1" src="~/Controls/Content.ascx"" tagName="Content"/> </controls>
調(diào)用用戶控件:
<uc1:Content ID="Content1" runat="server" />
服務(wù)端代碼:
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
利用用戶控件的轉(zhuǎn)成字符串返回到客戶端,用戶ajax請求html內(nèi)容。
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方法的作用是創(chuàng)建一個Control實例并返回,RenderView方法的作用則就是生成HTML了。這個實現(xiàn)方式的技巧在于使用了一個新建的Page對象作為生成控件的“容器”,而最后其實我們是將Page對象的整個生命周期運行一遍,并且將結(jié)果輸出。由于這個空的Page對象不會產(chǎn)生任何其他代碼,因此我們得到的,就是用戶控件生成的代碼了。
ViewManager<Content> load = new ViewManager<Content>(); Content Content2 = load.LoadViewControl("Content.ascx") as Content; Content2.hif = "123"; string resultHtml = load.RenderView(Content2);
四、用戶控件使用小結(jié)
(1)用戶控件使開發(fā)人員能夠使用編寫WEB窗體頁的相同編程技巧輕松地定義自定義控件。 作為約定,用.ascx文件擴(kuò)展名指示這樣的控件。這樣可以確保用戶控件文件不能作為獨立的WEB窗體頁執(zhí)行。
(2)用戶控件通過Register指令包括在另一WEB窗體頁中,該指令指定TagPrefix、TagName和Src location。
(3)注冊了用戶控件后,可以像普通的服務(wù)器控件那樣將用戶控件標(biāo)記放置在WEB窗體頁中(包括runat="server"屬性)。在包含WEB窗體頁中將用戶控件的公共字段、屬性和方法提升為該控件的公共屬性(標(biāo)記屬性)和方法。
(4)用戶控件參與每個請求的整個執(zhí)行生存期,并且可以處理自己的事件,封裝來自包含WEB窗體頁的一些頁邏輯。
(5)用戶控件不應(yīng)包含任何窗體控件,而應(yīng)依靠其包含WEB窗體頁在必要時包括窗體控件。
(6)可以使用System.WEB.UI.Page類的LoadControl方法以編程方式創(chuàng)建用戶控件。用戶控件的類型由ASP.NET運行庫決定,遵循約定文件名_擴(kuò)展名。
(7)只有當(dāng)為用戶控件包括了Register指令時,用戶控件的強(qiáng)類型才能由包含WEB窗體頁使用(即使沒有實際聲明的用戶控件標(biāo)記)。
五、結(jié)束語
在編寫WEB應(yīng)用程序時,如果將可能重復(fù)出現(xiàn)的元素都用用戶控件來實現(xiàn),那將大大減少維護(hù)代碼的代價。而且在修改代碼時,記得修改一段代碼卻忘了修改另一段同樣代碼的情況也將不存在了。代碼越短,出現(xiàn)錯誤的因素越少,出現(xiàn)錯誤的可能性就越小。
用戶控件和自定義控件的區(qū)別如下:
到此這篇關(guān)于ASP.NET中使用用戶控件的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
.net?6精簡版webapi教程及熱重載、代碼自動反編譯演示
這篇文章介紹了.net?6精簡版webapi教程及熱重載、代碼自動反編譯演示,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12.Net行為型設(shè)計模式之職責(zé)鏈模式(Chain of Responsibility)
這篇文章介紹了.Net行為型設(shè)計模式之職責(zé)鏈模式(Chain of Responsibility),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-05-05.NET?6全新配置對象ConfigurationManager介紹
這篇文章介紹了.NET?6全新配置對象ConfigurationManager,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11ASP.NET Core應(yīng)用啟動Startup類簡介
這篇文章介紹了ASP.NET Core中的應(yīng)用啟動Startup類,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04.NET?Core使用flyfire.CustomSerialPort實現(xiàn)Windows/Linux跨平臺串口通訊
本文詳細(xì)講解了.NET?Core使用flyfire.CustomSerialPort實現(xiàn)Windows/Linux跨平臺串口通訊的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01