【Asp.net之旅】--因自己定义控件注冊而引发的思考

前言


        近期在开发远洋的SOA系统平台,开发使用的是.NET平台。对于Asp.net并不困难,但该系统的开发并非全然依靠Asp.net。而是自身封装好的框架。这套框架是远洋地产购买的微软的开发平台,项目投资巨大。开发者众多。

        对于使用Asp.net开发已经相当的熟悉,假设直接使用Asp.net开发平台的话相信非常easy就行上手,但世事并非我们想象的那么简单,这次远洋地产代号为海鸥2号的平台开发使用了微软的MVC框架,并且在开发时採用的是SOA,面向服务框架的程序设计。它是基于面向对象的但又不是全然面向对象。可以说是面向服务的WebService开发。

       这套框架是由微软直接提供。微软的project师们对框架功能封装的非常完美,对开发者经常使用的开发方法甚至每一个推断循环都做了封装,这也是它的缺点,平台封装太彻底,在开发时一些复杂的功能平台不能实现的就必须自己开发。

       不知道什么时候開始关注变的关注技术细节了。对一些曾经没有接触过的东西感觉特别蹩脚,每当在接触新东西的时候总是在寻找旧东西的影子,对于开发来说这是好事。说明已经有了非常多经验,新东西变成了旧东西能非常快上手开发这就是开发者的能力,假设映射到生活中的话那就是大事了。生活须要往前看。过去的不可以再返回。所以要向前看,过了山眼界就开阔了。

       回到文章的正题,事实上本篇文章重点在于讨论Asp.net自己定义控件的注冊方法。由注冊问题引发了一系列的思考。使用Asp.NET开发的自己定义控件在使用前须要将它注冊到页面表单中,注冊后的自己定义控件就能实现正常的使用。例如以下的使用演示样例:

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

      在一个webform中加入了一条注冊信息,当中分别指定了控件集合的程序集名称和命名空间名称,并为控件的命名控件进行了重命名。


 

一、@Register


      @ Register是对自己定义控件注冊的keyword,它可以非常easy的引用一个自己定义控件。

同一时候它也有非常多属性例如以下:

        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的用法。制定了在解决方式进行编译时须要调用编译的内容。

posted @ 2017-04-20 10:16  llguanli  阅读(167)  评论(0编辑  收藏  举报