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