【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" ...
随机推荐
- (算法)判断字符串中是否包含HelloWorld
题目: 给定某字符串,判断该字符串中是否包含HelloWorld,出现HelloWorld不一定要连续,但顺序不变,如“HeByello,ByeWorByeld”就包含“HelloWorld”. 思路 ...
- ImportError: No module named arcpy
好久没写Python脚本了,今天一运行就报错:未找到名称为 arcpy 的模块(ImportError: No module named arcpy). 多半是环境变量出问题了,Python最令人讨厌 ...
- 如何自定义CollectionView中每个元素的大小和间距
问题: 让每个元素大小变为104 x 104 Step 1: 在你的视图控制器头文件中实现UICollectionViewFlowLayout协议 eg: @interface XXViewContr ...
- ZH奶酪:VirtualBox虚拟机与主机ping不通
6.进入虚拟机的Ubuntu(以下简称VBUbuntu),在VBUbuntu中用ifconfig查看ip地址,在Windows7中用ipconfig查看ip地址. 在VBUbuntu中ping Win ...
- Linux软件安装方法
常用的两种软件安装方法: 1.RPM软件安装 rpm -qi 软件名 查询 rpm -ivh *.rpm 安装 rpm -e 软件名 卸载 系统自带的一些rpm包在系统镜像的Server文件夹里,需要 ...
- 算法笔记_195:历届试题 错误票据(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 某涉密单位下发了某种票据,并要在年终全部收回. 每张票据有唯一的ID号.全年所有票据的ID号是连续的,但ID的开始数码是随机选定的. 因为 ...
- python中的sort、sorted、reverse、reversed详解
python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...
- MVC时间对比及时间范围判断
方法一:使用DateTime.Compare 方法 public static int Compare( DateTime t1, DateTime t2 ) t1 早于 t2:小于零t1 与 t2 ...
- MySQL必知必会笔记(六)存储过程 游标 触发器
留印:http://blog.sina.com.cn/s/articlelist_1254871964_5_1.html 第二十三章 使用存储过程 MySQL5 中添加了存储过程的支持. ...
- CentOS下安装IDE -- QTCreator
月底,美国的大佬们将会过来给我们几个搞一个培训.老大要求我们提前学习一下Qt. 我现在的首要任务是在自己的CentOS系统上安装一下Qt开发环境. 1. 获取下载地址 Qt的官网是:http://qt ...