關於asp.net書籍不少,好比《asp.net系統精髓》,《asp.net典型模塊開發》等等。 html
看這些書能夠輕鬆自定義網店,電子商務網站。 程序員
通常開發asp.net開發的集成開發環境是visual studio ,其版本能夠是2010,2013.2015等等,不多使用Dreamweaver cs6編輯器開發asp.net自定義控件。 編程
如今,開始visual studio 2010的asp.net編程之旅 數組
ASP.NET編程時,並不侷限於Visual Studio 2010工具箱中的那些服務器組件,還能夠開發本身的用戶控件(User Control)和自定義控件(Custom Control),從而進一步加強Visual Studio 2010進行ASP.NET編程的功能重用和代碼共享。 安全
在ASP.net編程中,代碼重用廣泛採用的是SSI(Server Side Include)方法,經過Include指令將另一個文件中的ASP代碼插入到Include指令處。這樣就能夠將不一樣ASP程序的公共部分提取出來,放入一個擴展名爲。INC的文件中,並經過Include指令來共享。 服務器
而在ASP.NET中,用戶控件的方法徹底取代了SSI,並且編程比SSI更加簡單,由於用戶控件對控件內部代碼進行了封裝,因此不會出現SSI方法中的函數名或者變量衝突的狀況。而且拖曳使用的方法也比SSI更爲直觀。 框架
自定義控件是對系統自己控件的繼承和擴充,在程序中以DLL文件形式存在。自定義控件能夠爲開發人員提供可複用的、可視化UI組件,從而具備更大的靈活性,可是開發比較複雜。 asp.net
本章將經過實例,介紹用戶控件和自定義控件之間的區別和編寫方法。 編程語言
用戶控件 編輯器
用戶控件使用戶可以根據應用程序的須要,方便地定義控件,用戶所使用的編程技術將與編寫Web窗體頁的技術相同。用戶甚至只須要稍作修改,便可將Web窗體頁轉換爲Web用戶控件。爲了確保用戶控件不能做爲獨立的Web窗體頁來運行,用戶控件一概使用文件擴展名。ascx來進行標識。
用戶控件基礎知識
任何一段HTML都能成爲一個用戶控件,將字符串「Hello」存爲一個以擴展名爲.ascx的文件,那麼一個用戶控件就誕生了。
ASP.NET Web用戶控件與完整的ASP.NET網頁(.aspx文件)類似,同時具備用戶界面頁和代碼。能夠採起與建立ASP.NET頁類似的方式建立用戶控件,而後向其中添加所需的標記和子控件。用戶控件能夠像頁面同樣包含對其內容進行操做(包括執行數據綁定等任務)的代碼。只要知足一下兩點要求就能夠成爲用戶控件:
一、用戶控件的文件擴展名爲「.ascx」。
二、用戶控件中沒有html、body和form 元素。這些元素必須位於調用用戶控件的頁面中。
除了這兩個基本要求外,用戶控件還具備另外兩個特點:
一、用戶控件中沒有@ Page指令,而是包含@ Control指令,該指令對配置及其餘屬性進行定義。
二、用戶控件不能做爲獨立文件運行。而必須像處理任何控件同樣,將它們添加到ASP.NET 頁中。
用戶控件和Aspx頁面同樣,能夠定義類、使用方法、屬性和事件,編程技術和普通頁面編程沒有什麼區別。調用用戶控件,只須要將用戶控件文件像其餘ASP.NET控件同樣拖曳到aspx頁面的相應位置便可。Visual Studio 2005將自動在aspx頁面上插入一條引用指令,例如:
<%@ Register Src="WebUC.ascx" TagName="WebUC" TagPrefix="uc1" %>
這行語句的做用是註冊用戶控件WebUC,即通知ASP.NET在碰到標記<uc1:WebUC>的時候將用戶控件WebUC插入到此處。
在上面這條註冊語句中,有三個屬性須要定義:
·Src
指向控件文件的位置,通常爲虛擬路徑加上控件文件名,如「WebUC.ascx」或者「/UserControl/WebUC.ascx」等。不能使用物理路徑名,如「c:\UserControl\WebUC.ascx」。
·TagName
定義控件的名稱,在同一個命名空間裏的控件名是惟一的。控件名通常都代表控件的功能。
·TagPrefix
定義控件的命名空間,和類的命名空間同樣,爲了防止不一樣做用的同名用戶控件在一塊兒引發衝突。固然,在實際使用中諸如「uc1」或者「uc2」這樣的名字是不該該使用的,而應該定義爲該組織的域名或者組織機構等不容易混淆的名稱。
控件註冊後,就能夠像工具箱中其餘服務器端控件同樣被使用。經過定義目標前綴(TagPrefix)和目標名(TagName),便可以像使用服務器端內建控件同樣地進行使用。同時也肯定了使用服務端運行(runat=「server」)方式,下面是Aspx頁面調用用戶控件的基本方式:
<uc1:WebUC ID="WebUC1" runat="server" />
命名空間和控件名稱之間使用「:」進行隔開,當服務器解析時把它與制訂的用戶控件關聯在一塊兒,這個結合對已註冊的每一個用戶控件必須是惟一的。
用戶控件編寫實例—微調控件
下面以微軟MSDN中的一個微調控件爲例,來介紹用戶控件編寫和使用過程。
控件的外觀如圖18-1所示,整個用戶組件分紅三部分,一個文本框和兩個命令按鈕,控件功能描述以下:控件可以在文本框之中進行「Read」、「Blue」、「Green」、「Yellow」四種顏色切換,按「^」往上翻,按「v」往下翻。文本框的內容不容許用戶自行輸入。
圖 微調控件外觀
要創建用戶控件,首先必須創建一個ASP.NET網站,而後在網站裏面經過解決方案資源管理器來添加用戶控件。若是須要在別的網站中使用本項目中的用戶控件的話,必須將用戶控件文件拷貝到須要使用它的網站當中。
在剛創建的ASP.NET網站的解決方案資源管理器中右鍵單擊項目路徑,彈出右鍵菜單,在菜單中選擇「添加新項」,如圖18-2所示。
圖 添加新項目
在彈出的「添加新項」的對話框中,選擇模板類型「Web用戶控件」,給控件命名爲ucAdj,輸入完畢後,點擊「添加」按鈕,在解決方案資源管理器中將添加一個名爲ucAdj的新項目,如圖。
圖 添加的用戶控件
打開ucAdj的設計頁面,從工具箱中拖一個TextBox和兩個Button到頁面上,並按圖,所示位置進行排列,按以下要求設置三個控件的屬性:
文本框:
ID textColor
ReadOnly True
按鈕一:
ID buttonUp
Text ^
按鈕二:
ID buttonDown
Text v
至此,界面設計完畢。
雙擊用戶控件空白處,進入代碼編輯界面,將下面代碼按要求在正確的位置輸入。
代碼以下: ucAdj.ascx.cs
//文件名:ucAdj.ascx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class ucAdj : System.Web.UI.UserControl
{
protected int currentColorIndex;
protected String[] colors = { "Red", "Blue", "Green", "Yellow" };
protected void Page_Load(object sender, EventArgs e)
{
if (IsPostBack)
{
currentColorIndex =
Int16.Parse(ViewState["currentColorIndex"].ToString());
}
else
{
currentColorIndex = 0;
DisplayColor();
}
}
protected void DisplayColor()
{
textColor.Text = colors[currentColorIndex];
ViewState["currentColorIndex"] = currentColorIndex.ToString();
}
protected void ButtonUp_Click(object sender, EventArgs e)
{
if (currentColorIndex == 0)
{
currentColorIndex = colors.Length - 1;
}
else
{
currentColorIndex -= 1;
}
DisplayColor();
}
protected void buttonDown_Click(object sender, EventArgs e)
{
if (currentColorIndex == (colors.Length - 1))
{
currentColorIndex = 0;
}
else
{
currentColorIndex += 1;
}
DisplayColor();
}
}
黑色代碼爲系統自動生成,灰色代碼爲輸入的代碼,下面就其中部分代碼進行解釋。
代碼「protected int currentColorIndex;」申明一個保護的整型變量currentColorIndex,此變量用來保存當前被選中的顏色的索引值。
「protected String[] colors = { "Red", "Blue", "Green", "Yellow" };」則申明一個保護的字符串數組colors,colors中保存着四中顏色的英文名稱,用於輸出相應索引值的顏色。例如要取綠色,則使用colors[2]便可取得。
「IsPostBack」用來判斷頁面請求是否是回傳,若是是第一次打開此頁面,則「IsPostBack」爲false,這個時候將執行「currentColorIndex=0;」的語句,經過調用「DisplayColor();」將在文本框中顯示「Red」。若是不是第一次頁面請求的話,必須在每一次頁面刷新的時候,將ViewState中的currentColorIndex取出來,存到程序的currentColorIndex中。
「DisplayColor()」方法專門將當前的顏色選擇顯示到文本框中並保存到頁面的ViewState。
「buttonUp」和「buttonDown」單擊事件的處理方法中,直接對currentColorIndex進行修改,「buttonUp」被單擊後,對currentColorIndex減一,若是currentColorIndex已是0,則把currentColorIndex設置爲最大值即:colors.Length-1。「buttonDown」的處理方法與「buttonUp」相似。
將全部代碼輸入並保存後,還須要將用戶控件拖到default.aspx中,即在default.aspx頁面中添加一個用戶控件ucAdj,如圖所示。
將ucAdj控件添加到default.aspx頁面
點擊運行後,能夠看到default.aspx運行效果如圖
如何將Web窗體轉換爲用戶控件
若是用戶已經開發了Web窗體頁,並決定在整個應用程序中訪問其功能,則能夠對該文件進行一些小改動,將其改爲用戶控件。Web用戶控件與Web窗體很是類似,他們是使用相同的技術建立的。當將Web窗體頁轉換成Web用戶控件時,建立一個可再次使用的UI組件,用戶將能夠在其餘Web窗體頁上使用該組件。
將單個文件的ASP.NET網頁轉換爲用戶控件
一、重命名控件使其文件擴展名爲".ascx".
二、從該頁面中移除 html、body 和form元素。
三、將@ Page指令更改成@ Control指令。
四、移除@ Control指令中除Language、AutoEventWireup(若是存在)、CodeFile 和 Inherits 以外的全部屬性。
五、在@ Control指令中包含className屬性。這容許將用戶控件添加到頁面時對其進行強類型化。
將代碼隱藏 ASP.NET 網頁轉換爲用戶控件
一、重命名".aspx"文件,使其文件擴展名爲".ascx".
二、根據代碼隱藏文件使用的編程語言,重命名代碼隱藏文件使其文件擴展名爲".ascx.vb"或".ascx.cs".
三、打開代碼隱藏文件並將該文件繼承的類從Page更改成UserControl.
四、在".aspx"文件中,執行如下操做:
·從該頁面中移除html、body和form元素。
·將@ Page指令更改成@ Control 令。
·移除@ Contro 指令中除Language、AutoEventWireup(若是存在)、CodeFile和Inherits 以外的全部屬性。
·在@ Control指令中,將CodeFile屬性更改成指向重命名的代碼隱藏文件。
五、在@ Control指令中包含className屬性。這容許將用戶控件添加到頁面
自定義控件
利用Visual Studio 2005進行自定義控件開發是一件很輕鬆的事情,用戶只須要定義一個直接或者間接從Control派生的類,而後重寫它的Render方法便可。System.Web.UI.Control與System.Web.UI.WebControls.WebControl兩個類是服務器控件的基類,Control類定義了全部服務器控件共有的屬性、方法和事件,其中包括控制控件執行生命週期的方法和事件,以及ID、UniqueID、Parent、ViewState和Controls(子控件集合)等屬性。Control沒有用戶界面(UI)特定的任何功能。若是創做的控件沒有提供UI,或者組合了其餘呈現其本身的UI控件,則從Control派生。WebControl類是從Control類派生的,併爲UI功能提供附加的屬性和方法。這些屬性包括ForeColor、BackColor、Font、BorderStyle、Height和Width.WebControl是ASP.NET中Web服務器控件系列的基類。若是控件呈現UI,則從WebControl派生。
用戶能夠重寫從基類繼承的屬性、方法和事件,並能夠將新的屬性、方法和事件添加到自定義控件中,如前所述,可使用重寫Render方法來實現對HTML代碼的輸出。Render方法採用System.Web.UI.HtmlTextWriter類型的參數,控件要發送到客戶端的HTML做爲字符串參數傳遞到HtmlTextWriter的Writer方法。
自定義控件基礎知識
要清楚自定義控件的知識結構,關鍵要理解下面的定義(下面的定義摘自MSDN):
[ThemeableAttribute(true)]
public class WebControl : Control, IattributeAccessor
其實類WebControl是從Control定義而來,那麼上面的定義能夠這麼理解:
Public class System.Web.UI.WebControls.WebControl:System.Web.UI.Control。
編寫用戶自定義控件既能夠繼承自Control也能夠繼承自WebControl,相對來說繼承自WebControl進行編程要比繼承自Control要容易得多,WebControl幫助程序員實現了不少功能,只是其「自定義」能力要比繼承自Control稍微差一些。
圖 自定義控件的繼承層次結構
Control類是在開發自定義ASP.NET服務器控件時做爲派生源的主要類。Control沒有任何針對用戶界面(UI)的功能。若是要創做沒有UI的控件或者組合其餘呈現它們本身的UI的控件,則能夠從Control派生。若是要創做具備UI的控件,則須要從WebControl或System.Web.UI.WebControls命名空間中的任何控件派生,該命名空間爲自定義控件提供適當的起點。
Control類是包括自定義控件、用戶控件和頁在內的全部ASP.NET服務器控件的基類。ASP.NET頁是Page類(該類從Control類繼承)的實例,而且處理對擴展名爲.aspx的文件的請求。
Control類能夠直接或間接地用做Web應用程序的用戶界面的一部分,所以應對它進行仔細檢查,以確保遵循編寫安全代碼和保護應用程序的最佳作法。
WebControl類提供全部Web服務器控件的公共屬性、方法和事件。經過設置在此類中定義的屬性,能夠控制Web服務器控件的外觀和行爲。例如,經過使用BackColor和ForeColor屬性,能夠分別控制控件的背景色和字體顏色。在能夠顯示邊框的控件上,能夠經過設置BorderWidth、BorderStyle和BorderColor屬性,控制邊框寬度、邊框樣式和邊框顏色。Web服務器控件的大小能夠經過Height和Width屬性來指定。
控件的行爲能夠經過設置某些屬性來指定。經過設置Enabled屬性,能夠啓用和禁用控件。經過設置TabIndex屬性,能夠控制控件在Tab鍵順序中的位置。經過設置ToolTip屬性,能夠爲控件指定工具提示。
簡單自定義控件的實現
自定義控件編寫後,可使用Visual Studio 2010將其編譯成.DLL文件,而後在其餘的.NET項目中調用,使用方法就跟工具箱中的其餘控件同樣。
仍是引用MSDN中的一個例子,對自定義控件功能描述以下:控件運行後,顯示「Please Click me!」這樣一行文字,用鼠標單擊便彈出一個對話框,內容爲「Hello」。該自定義控件編寫過程以下:
新建一個項目,在項目類型爲「Visual C#」中的「Windows」,模板選擇「Web控件庫」,如圖。
圖18-6 新建Web 自定義控件
點擊肯定後,Visual Studio 2010自動生成自定義控件的框架,如圖。
圖 Visual Studio 2010 自動生成控件代碼
代碼以下:
表明自定義控件代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace wcHello
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
public class WebCustomControl1 : WebControl
{
[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]
public string Text
{
get
{
String s = (String)ViewState["Text"];
return ((s == null) ? String.Empty : s);
}
set
{
ViewState["Text"] = value;
}
}
protected override void RenderContents(HtmlTextWriter output)
{
output.Write(Text);
}
}
}
上面的代碼實現Label控件的功能,能夠經過修改控件的Text屬性來該變控件顯示的內容。代碼修改爲以下所示:
表明 修改Text屬性後的代碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace wcHello
{
public class HelloControl : WebControl
{
public HelloControl()
: base(HtmlTextWriterTag.Span)
{ }
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "alert('Hello');");
writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
base.AddAttributesToRender(writer);
}
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void RenderContents(HtmlTextWriter writer)
{
writer.Write("Custom Contents");
base.RenderContents(writer);
}
}
}
「public HelloControl(): base(HtmlTextWriterTag.Span){ }」是本控件的構造函數,直接調用基類的構造函數。
「[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]」這句是對權限的控制,Demand要求調用堆棧中的全部高級調用方都已被授予了當前權限對象所指定的權限,其餘類型的權限以下:
Assert:即便堆棧中的高級調用方未被授予訪問當前權限對象所標識資源的權限,調用代碼仍能訪問該資源。
Demand:要求調用堆棧中的全部高級調用方都已被授予了當前權限對象所指定的權限。
Deny:即便調用方已被授予訪問當前權限對象所指定資源的權限,調用方訪問該資源的能力仍被拒絕。
InheritanceDemand:要求繼承此類或重寫某一方法的派生類已被授予了指定的權限。
LinkDemand:要求直接調用方已被授予了指定的權限。
有關聲明性安全和連接要求的更多信息,請參見MSDN用於類和成員範圍的聲明式安全。
PermitOnly:即便代碼已被授予訪問其餘資源的權限,也只能訪問此權限對象所指定的資源。
RequestMinimum:請求使代碼運行所需的最小權限。此操做只能在程序集範圍內使用。
RequestOptional:請求可選的附加權限(並不是運行所必需的權限)。此操做只能在程序集範圍內使用。
RequestRefuse:請求不將可能被誤用的權限授予調用代碼。此操做只能在程序集範圍內使用。
WebControl類的AddAttributesToRender方法用於將控件的屬性呈如今控件的HTML標記中。此方法一般由控件開發人員在派生類中重寫,以將適當的屬性和樣式插入到控件的 HtmlTextWriter輸出流中。在重寫AddAttributesToRender方法時,請務必調用基類中的相應方法。不然,將不會呈現基類中包含的屬性。
「RenderContents」方法將控件的內容呈現到指定的編寫器中。此方法主要由控件開發人員使用。和AddAttributesToRender方法同樣,在方法的最後要進行基類函數的調用。
全部代碼輸入完畢,確認沒有拼寫錯誤後,即可以進行代碼的編譯,若是編譯成功則會在Visual Studio 2010的狀態欄中提示「生成成功」。
打開項目的文件夾,能夠看到有若干子文件夾,如圖所示。
圖 項目文件夾
在bin文件夾下面,根據編譯時是選擇debug版本仍是Release版本會出現相應的文件夾,打開後,能夠看到wcHello.dll和wcHello.pdb兩個文件。wcHello.dll是控件自己,wcHello.pdb是調試符號文件。
在工程中使用自定義控件
新建一個網站,位置爲"E:\HelloExample",打開default.aspx的設計界面,在工具箱面板標準卡上單擊右鍵,在彈出菜單中選擇"選擇項",如圖所示。
圖 添加控件到工具箱
選擇"選擇項"後,Visual Studio 2010彈出"選擇工具箱項"對話框,如圖下。
圖 選擇工具箱項
在。NET中,既可使用。NET組件也可使用COM組件,在".NET Framework組件"欄中選擇"瀏覽"按鈕,在"打開"對話框中選擇上節編譯好的自定義控件,如圖18-11所示。
圖18-11 添加wcHello控件到工具箱
點擊"打開"後,控件HelloControl被添加到".NET Framework組件"中,點擊"肯定"後,控件HelloControl添加到了工具箱中,如圖18-12所示。
圖 工具箱中的HelloControl
在"解決方案資源管理器"中能夠看到HelloControl所在的文件夾已經添加,如圖18-13所示。
圖 解決方案管理器對控件文件夾的引用
在default.aspx頁面的設計視圖中,將工具箱中的HelloControl控件拖放到頁面,如圖下。
圖 在頁面中拖入一個HelloControl控件
單擊"運行"按鈕後,將看到default.aspx運行後的頁面,如圖所示。
圖 default.aspx運行結果
在頁面紅色文字"Custom Contents"上用鼠標左鍵單擊,彈出一個對話框,顯示文字"Hello",如圖下。
OK。這是asp.net自定義控件項目所有過程。
adiOS
my glory for my god