前言

近期在开发远洋的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之旅】--因自己定义控件注冊而引发的思考的更多相关文章

  1. Android自己定义控件之应用程序首页轮播图

    如今基本上大多数的Android应用程序的首页都有轮播图.就是像下图这种(此图为转载的一篇博文中的图.拿来直接用了): 像这种组件我相信大多数的应用程序都会使用到,本文就是自己定义一个这种组件,能够动 ...

  2. asp.net动态加载ascx用户控件

    原文:asp.net动态加载ascx用户控件 在主aspx/ascx文件中,将目标ascx1,ascx2控件拖拉到其页面中,然后删除,目的是要生成:Register 代码,然后在主文件中定义DIV或T ...

  3. Android自定义控件1--自定义控件介绍

    Android控件基本介绍 Android本身提供了很多控件比如我们常用的有文本控件TextView和EditText:按钮控件Button和ImageButton状态开关按钮ToggleButton ...

  4. asp.net中遍历界面上所有控件进行属性设置

    * 使用方法: *  前台页面调用方法,重置:    protected void Reset_Click(object sender, EventArgs e)        {           ...

  5. Qt 界面使用自己定义控件 &quot;提升为&quot;

    1.效果图 我做了一个很easy的样例,一个能够显示颜色的QLabel,边上有个button,点击,跳出颜色选取的Dialog,然后选择一个颜色.这个QLabel会变成什么颜色. 2.ColorLab ...

  6. Android自己定义控件(状态提示图表)

    [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处.尊重分享成果] 1 背景 前面分析那么多系统源代码了.也该暂停下来歇息一下,趁昨晚闲着看见一个有意思的需求就操 ...

  7. 【Android】自己定义控件——仿天猫Indicator

    今天来说说类似天猫的Banner中的小圆点是怎么做的(图中绿圈部分) 在学习自己定义控件之前,我用的是很二的方法,直接在布局中放入多个ImageView,然后代码中依据Pager切换来改变图片.这样的 ...

  8. Asp.Net2.0下C#环境 Login控件实现用户登录

    原文:Asp.Net2.0下C#环境 Login控件实现用户登录 一.前台显示效果 二.前台代码             <asp:Login ID="Login1" run ...

  9. Android_declare-styleable_自己定义控件的属性

    1.简单实例 (1).在res/values文件下定义一个attrs.xml文件 <? xml version="1.0" encoding="utf-8" ...

随机推荐

  1. Android插件化(三)载入插件apk中的Resource资源

    Android载入插件apk中的Resource资源 简单介绍 怎样载入未安装apk中的资源文件呢?我们从android.content.res.AssetManager.java的源代码中发现,它有 ...

  2. VS2010已停止工作,framework 4.0安装失败

    好久没在台式机上写程序了,今天打开一个解决方案,报错: 从来没有遇到这种情况,重新关闭解决方案,在菜单栏中打开解决方案说没有framework 4.0,其实我安装的是4.5 ,也有4.0,于是全部卸载 ...

  3. 如何用代码组织多个Storyboard(故事板)

    1. 新建一个Storyboard取名为OtherStoryboard.storyboard 2. 使用下面代码加载 UIStoryboard *newStoryboard = [UIStoryboa ...

  4. 解决Windows7 Embedded连接手机问题

    故障现象:正确安装厂商自带的驱动后,插入安卓或iPhone手机,提示找到新硬件,却无法成功安装驱动.在此可以肯定的是:手机驱动无问题,手机.连接线也无问题.看来问题又落到“Embedded”上了! 仔 ...

  5. Oracle多行记录合并自定义函数

    在oracle数据库中,进行字段合并,可以使用wm_concat(column)函数,但是在这种方法不被Oracle所推荐,因为WMSYS用户用于Workspace Manager,其函数对象可能因版 ...

  6. The Web Sessions List

    The Web Sessions list contains the list of HTTP Requests that are sent by your computer. You can res ...

  7. Php优化方案

    1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静态方法的 ...

  8. 【微信小程序】:评论、回复和删除功能 -- 2017/7/14

    1.理论核心:传参->pid,评论父id需要在wxml页面传递:小程序端和WEB端不同核心:前者操纵数据,后者操纵DOM元素对象 2.不废话,直接代码:wxml <view class=& ...

  9. Nginx日志分析利器之GoAccess

    1.介绍GoAccess 是一个用来统计 Apache Web 服务器的访问日志的工具,可即时生成统计报表,速度非常快 查看的统计信息有: 统计概况,流量消耗等 访客排名 动态Web请求 静态web请 ...

  10. Mysql 5.7 从节点配置多线程主从复制

    Mysql 采用多线程进行复制是从 Mysql 5.6 开始支持的内容,但是 5.6 版本下有缺陷,虽然支持多线程,但是每个数据库只能一个线程,也就是说如果我们只有一个数据库,则主从复制时也只有一个线 ...