【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的用户控件,须要将它注冊到页面中。程序集的视图例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdfeGlueGl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
则在其他页面中引用该控件时的代码例如以下:
<%@ 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中使用,例如以下图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdfeGlueGl1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
对应的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的用法。制定了在解决方式进行编译时须要调用编译的内容。
【Asp.net之旅】--因自己定义控件注冊而引发的思考的更多相关文章
- Android自己定义控件之应用程序首页轮播图
如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...
- asp.net动态加载ascx用户控件
原文:asp.net动态加载ascx用户控件 在主aspx/ascx文件中,将目标ascx1,ascx2控件拖拉到其页面中,然后删除,目的是要生成:Register 代码,然后在主文件中定义DIV或T ...
- Android自定义控件1--自定义控件介绍
Android控件基本介绍 Android本身提供了很多控件比如我们常用的有文本控件TextView和EditText:按钮控件Button和ImageButton状态开关按钮ToggleButton ...
- asp.net中遍历界面上所有控件进行属性设置
* 使用方法: * 前台页面调用方法,重置: protected void Reset_Click(object sender, EventArgs e) { ...
- Qt 界面使用自己定义控件 "提升为"
1.效果图 我做了一个很easy的样例,一个能够显示颜色的QLabel,边上有个button,点击,跳出颜色选取的Dialog,然后选择一个颜色.这个QLabel会变成什么颜色. 2.ColorLab ...
- Android自己定义控件(状态提示图表)
[工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操 ...
- 【Android】自己定义控件——仿天猫Indicator
今天来说说类似天猫的Banner中的小圆点是怎么做的(图中绿圈部分) 在学习自己定义控件之前,我用的是很二的方法,直接在布局中放入多个ImageView,然后代码中依据Pager切换来改变图片.这样的 ...
- Asp.Net2.0下C#环境 Login控件实现用户登录
原文:Asp.Net2.0下C#环境 Login控件实现用户登录 一.前台显示效果 二.前台代码 <asp:Login ID="Login1" run ...
- Android_declare-styleable_自己定义控件的属性
1.简单实例 (1).在res/values文件下定义一个attrs.xml文件 <? xml version="1.0" encoding="utf-8" ...
随机推荐
- [Javascript] Closure Cove, 1
Returning a function from a function, complete with variables from an external scope, is called a cl ...
- CentOS6.3 安装配置 ant
OS:CentOS6.3 ant版本:apache-ant-1.9.2-bin 第1步:下载ant apache-ant-1.9.2-bin.tar.gz 第2步:解压 tar -zxvf apach ...
- 队列实例程序(C语言)
/* queue.h */ #ifndef _QUEUE_H #define _QUEUE_H struct queue_record; typedef struct queue_record *qu ...
- SSO是什么?
SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信仸的应用系统.它包括可以将这次主要的登录映射到其他应用中用亍同一个用户的登录的机制 ...
- java面试第十八天
软件开发流程: 1.可行性分析 2.需求分析->开发测试 3.概要设计->分隔模块,定义框架等 4.详细设计->类设计.接口设计 5.编码 6.测试 7.部署 8.维护 单元测试: ...
- 解决win10 64位系统可用2.99g
msconfig-->引导-->高级选项-->最大内存勾去掉
- 在js里双引号里又加单引号的解决方案常用WdatePicker
EndTime: '<input name="EndTime" type="text" class="editable center decim ...
- centos/rhel最小化安装图形化
图形化,一般不再服务器中安装.为了提升系统的利用率. centos的yum源对应centos的源 RHEL的yum源对应RHEL的源 我演示的Centos6.5,我挂载的RHEL6.5的源.作为软件源 ...
- CentOS下Storm 1.0.0集群安装具体解释
本文环境例如以下: 操作系统:CentOS 6 32位 ZooKeeper版本号:3.4.8 Storm版本号:1.0.0 JDK版本号:1.8.0_77 32位 python版本号:2.6.6 集群 ...
- asp.net三层架构详解(转)
摘自:http://www.cnblogs.com/cresuccess/archive/2008/12/10/1351675.html 一.数据库 ,) ) no ...