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

前言


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

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

       這套框架是由微軟直接提供。微軟的project師們對框架功能封裝的很是完美,對開發者常用的開發方法甚至每個推斷循環都作了封裝,這也是它的缺點,平臺封裝太完全,在開發時一些複雜的功能平臺不能實現的就必須本身開發。web

       不知道何時開始關注變的關注技術細節了。對一些曾經沒有接觸過的東西感受特別蹩腳,每當在接觸新東西的時候老是在尋找舊東西的影子,對於開發來講這是好事。說明已經有了很是多經驗,新東西變成了舊東西能很是快上手開發這就是開發者的能力,假設映射到生活中的話那就是大事了。生活需要往前看。過去的不能夠再返回。因此要向前看,過了山眼界就開闊了。緩存

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

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

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


 

1、@Register


      @ Register是對本身定義控件註冊的keyword,它能夠很是easy的引用一個本身定義控件。

同一時候它也有很是多屬性例如如下:
spa

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


        Note:需要在程序集中引用被註冊的本身定義控件所在的dll,另外它可以不指定,僅僅要將開發的本身定義控件的源碼放到App_Code目錄中就能夠,不然必須指定該屬性。debug


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

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


     (1)做爲程序的App_Code目錄的源碼。執行時在該目錄中動態編譯代碼;
     (2)將控件的dll文件引入到要使用的程序集中。

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

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

2、一個引用的樣例


 (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>



3、compilation 的 assemblies 的 add 元素


        向集合中加入程序集引用。

add元素一般配置在web.config中指定程序集中應用的控件,這樣就配置了程序集動態資源編譯期間使用的程序集引用,當編譯每一個代碼模塊時,ASP.NET 會本身主動將該程序集連接到資源。
         add 元素的值是程序集名稱,而不是 DLL 路徑。 ASP.NET 查找該程序集名稱,以找到其物理 DLL 位置。orm

還可以選擇指定星號 (*) 通配符來加入應用程序的專用程序集緩存中的每一個程序集,該程序集緩存位於應用程序的 \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的用法。制定了在解決方式進行編譯時需要調用編譯的內容。

相關文章
相關標籤/搜索