【Asp.net之旅】--因自定義控件註冊而引發的思考

前言


        最近在開發遠洋的SOA系統平臺,開發使用的是.NET平臺,對於Asp.net並不困難,但該系統的開發並不是完全依靠Asp.net,而是自身封裝好的框架,這套框架是遠洋地產購買的微軟的開發平臺,項目投資巨大,開發人員衆多。

        對於使用Asp.net開發已經相當的熟悉,如果直接使用Asp.net開發平臺的話相信很容易就能夠上手,但世事並不是我們想象的那麼簡單,這次遠洋地產代號爲海鷗2號的平臺開發使用了微軟的MVC框架,而且在開發時採用的是SOA,面向服務框架的程序設計,它是基於面向對象的但又不是完全面向對象,可以說是面向服務的WebService開發。

       這套框架是由微軟直接提供,微軟的工程師們對框架功能封裝的很完美,對開發人員常用的開發方法甚至每個判斷循環都做了封裝,這也是它的缺點,平臺封裝太徹底,在開發時一些複雜的功能平臺不能實現的就必須自己開發。

       不知道什麼時候開始關注變的關注技術細節了,對一些以前沒有接觸過的東西感覺特別蹩腳,每當在接觸新東西的時候總是在尋找舊東西的影子,對於開發來說這是好事,說明已經有了很多經驗,新東西變成了舊東西能很快上手開發這就是開發人員的能力,如果映射到生活中的話那就是大事了,生活需要往前看,過去的不能夠再返回,所以要向前看,過了山眼界就開闊了。

       回到文章的正題,其實本篇文章重點在於討論Asp.net自定義控件的註冊方法,由註冊問題引發了一系列的思考。使用Asp.NET開發的自定義控件在使用前需要將它註冊到頁面表單中,註冊後的自定義控件就能實現正常的使用,如下的使用示例:

<%@ Register Assembly="MCS.Library.SOA.Web.WebControls" Namespace="MCS.Web.WebControls" TagPrefix="SOA" %>

      在一個webform中添加了一條註冊信息,其中分別指定了控件集合的程序集名稱和命名空間名稱,併爲控件的命名控件進行了重命名。
 

一、@Register


      @ Register是對自定義控件註冊的關鍵字,它能夠非常簡單的引用一個自定義控件。同時它也有很多屬性如下:

        Assembly:自定義控件所在的程序集名稱,與tagprefix 屬性關聯的命名空間所駐留的程序集;


        Note:需要在程序集中引用被註冊的自定義控件所在的dll,另外它可以不指定,只要將開發的自定義控件的源代碼放到App_Code文件夾中即可,否則必須指定該屬性。


        Namespace:正在註冊的自定義控件的命名空間;
        src:指定使用的自定義控件的完整路徑(相對的或絕對的);
        tagname:用戶控件的別名,只應用與用戶控件;
        Tagpreix:一個任意別名,代表了Namespace的別名。

      Note:使用該命令引用控件時需要將控件的代碼放置到以下位置


     (1)作爲程序的App_Code文件夾的源代碼,運行時在該文件夾中動態編譯代碼;
     (2)將控件的dll文件引入到要使用的程序集中;

     (3)作爲全局緩存(GAC)中編譯和簽署的程序集,能在多個程序集間共享該控件,通過向assembly中分配在識別的字符串,如下:

<%@ Register  tagprefix="custom" namespace="Mycompany.namespace" assembly="Mycompany.namespace.control, Version=1.2.3.4, PublicKeyToken=12345678abcdefgh, Culture=neutral" %>

二、一個引用的例子


 (1)控件和頁面在同一程序集中
        在一個程序集中編寫了一個名爲toolBarTemplate.ascx的用戶控件,需要將它註冊到頁面中,程序集的視圖如下:

       則在其它頁面中引用該控件時的代碼如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SinoOcean.Seagull2.InductionAssessment.Default" %>

<!--註冊用戶控件toolBarTemplate.ascx-->
<%@ Register TagPrefix="tbt" TagName="toolBarTemplate" Src="~/UserControls/toolbarTemplate.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
	<title></title>
</head>
<body>
	<form id="form1" runat="server">
	<div>
        <!--使用用戶控件toolBarTemplate.ascx-->
        <tbt:toolBarTemplate runat="server" />
	</div>
	</form>
</body>
</html>

    (2)控件在其他程序集中
        想要使用第三方的自定義控件這時候就必須嚴格按照註冊的步驟進行了,首先要將引用的控件dll引用到程序集中,然後在使用的頁面使用@ Register註冊,最後使用。
開發了一個MCS.Web.Library的用戶控件程序集,需要將它引用到Default.aspx中使用,如下圖:


        相應的Default.aspx中的代碼如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SinoOcean.Seagull2.InductionAssessment.Default" %>

<!--註冊自定義控件-->
<%@ Register Assembly="MCS.Library.SOA.Web.WebControls" Namespace="MCS.Web.WebControls" TagPrefix="SOA" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
	<title></title>
</head>
<body>
	<form id="form1" runat="server">
	<div>
        <!--使用自定義控件-->
        <SOA:DataBindingControl runat="server" ID="bindingControl" AutoBinding="true" IsValidateOnSubmit="false">
		<ItemBindings>
			<SOA:DataBindingItem ControlID="opinionListView" DataPropertyName="Opinions">
			</SOA:DataBindingItem>
		</ItemBindings>
	</SOA:DataBindingControl>
	</div>
	</form>
</body>
</html>



三、compilation 的 assemblies 的 add 元素


        向集合中添加程序集引用。add元素通常配置在web.config中指定程序集中應用的控件,這樣就配置了程序集動態資源編譯期間使用的程序集引用,當編譯每一個代碼模塊時,ASP.NET 會自動將該程序集鏈接到資源。
         add 元素的值是程序集名稱,而不是 DLL 路徑。 ASP.NET 查找該程序集名稱,以找到其物理 DLL 位置。還可以選擇指定星號 (*) 通配符來添加應用程序的專用程序集緩存中的每一個程序集,該程序集緩存位於應用程序的 \bin 子目錄或 .NET Framework 安裝目錄( %systemroot%\Microsoft.NET\Framework\ 版本\)中。


如下代碼示例:

<system.web>
	<!--compilation指定編譯時的屬性-->
	<compilation debug="true" defaultLanguage="js" targetFramework="4.0">
		<assemblies>
			<add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
			<add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
			<add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
			<add assembly="System.Configuration.Install, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.Runtime.Serialization.Formatters.Soap, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.Transactions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
			<add assembly="System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
			<add assembly="System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
			<add assembly="System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" />
			<add assembly="System.Web.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.DirectoryServices.Protocols, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.EnterpriseServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
			<add assembly="System.Web.RegularExpressions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A" />
		</assemblies>
	</compilation>
	<authentication mode="None" />
	<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID" validateRequest="false" />
	<httpRuntime requestValidationMode="2.0" />
</system.web>


結語


      註冊自定義控件的方法和註冊dll的方法還有很多不同,其中自定義控件的註冊只需要在使用的頁面使用@Register即可,但是想要在設計器中使用一個第三方控件就必須在系統中註冊,所以兩種有很大的差別。文章重點討論了@Register的用法,另外還添加了Compilation的使用方法,制定了在解決方案進行編譯時需要調用編譯的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章