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

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值