在Visual Studio中,所有的ASP.NET 2.0控件都是自定义控件,创建自己的自定义控件一般需要完成以下三步。
(1)在站点APP_Code下创建一个新类;
(2)修改这个类,让它成为WebControl类(包含在System.Web.UI.WebControls命名空间)的派生类;
(3)重写基类(即WebControl类)的RenderContents()方法。

下面是一个最简单的ASP.NET控件,它的功能只有一个,显示"Hellow World"。

using System;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace myControls

{

public class HelloWorld : WebControl

{

protected override void RenderContents(HtmlTextWriter writer)

{

writer.Write("Hello World");

}

}

}
    自定义控件创建好之后,有三种方法将其添加到网页中。
    第一种选择是首先在aspx文件添加注册控件的代码:

<%@ Register TagPrefix="custom" Namespace="myControls" %>
    其中TagPrefix属性的值可随意选取,Namespace属性的值必须与你创建的自定义控件一致,然后在该页的任意位置均可引用此控件 。

<custom:HelloWorld ID="HelloWorld1" runat="server" />
    第二种选择是在Web.Config文件中注册此控件,这样你就可以在所有的aspx页面中引用此控件。相关配置如下:

<pages>

<controls>

<add tagPrefix="custom" namespace="myControls"/>

</controls>

</pages>     
    最后一种方式是将控件添加到Visual Studio工具箱中,使用时直接拖拉到网页中。但这个时候你不能在APP_Code文件夹下创建这个控件,而必须将其创建为独立的程序集,具体方法本文后面将会提到。创建好独立的自定义控件后,右键单击Visual Studio工具箱,选择“选择项”,之后会弹出一个对话框,从中选择你自己的程序集,自定义控件将自动出现在工具箱上。

嵌入Javascript

为了获得更好的客户端效果,我们需要引入Javascript和CSS样式表。在ASP.NET中,有一个类叫作ClientScriptManager,可以很方便的对Javascript进行操作,其中比较重要的方法有:

  • RegisterClientScriptBlock()
  • RegisterStartupScript()
  • RegisterClientScriptInclude()
  • GetWebResourceUrl()

RegisterClientScriptBlock和RegisterStartupScript方法允许你在网页中添加内置Javascript脚本,这两个方法一般用来添加比较简单的Javascript脚本,如果你需要添加复杂的Javascript脚本,可以使用RegisterClientScriptInclude或 GetWebResourceUrl()方法。RegisterClientScriptInclude()方法将会在网页中加入这样的引用:

<script type="text/Javascript" src="SomeScript.js"></script>    
    这种方式的缺点在于发布程序的时候需要将独立的js文件一起发布,解决这个问题的办法就是使用GetWebResourceUrl()方法,通过这个方法可以把js文件直接嵌入到控件当中,换句话说就是你发布的程序集将同时包含自定义控件和独立的js文件。与前面注册控件一样,在APP_Code里创建的自定义控件是不能同时包含js文件的,需要将其发布为独立的程序集。
    首先我们在Visual Studio里创建一个新的项目,类型选择类库。为了在类库工程里创建自定义控件,首先需要添加对System.Web.Dll的引用,然后选择工程里的js文件,将其生成事件属性修改为嵌入资源。接下来需要在AssemblyInfo中对每一个嵌入的资源添加WebResource属性,只需打开Properties里的AssemblyInfo.cs文件,添加以下代码:

[assembly: WebResource("WhoIsLooking.WhoIsLooking.js", "text/javascript")]    OnPreRender()方法中对js文件的调用代码:

// Add Javascript include

string scriptUrl = Page.ClientScript.GetWebResourceUrl( this.GetType(),

"WhoIsLooking.WhoIsLooking.js");

Page.ClientScript.RegisterClientScriptInclude("WhoIsLooking", scriptUrl);

嵌入CSS样式表

方法与嵌入Javascript类似,在AssemblyInfo.cs中添加:

[Assembly: WebResource("WhoIsLooking.WhoIsLooking.css", "text/css")]    
    在OnPreRender方法中添加:

// Add style sheet to parent page

string cssUrl = Page.ClientScript.GetWebResourceUrl(this.GetType(),

"WhoIsLooking.WhoIsLooking.css");

HtmlLink cssLink = new HtmlLink();

cssLink.Href = cssUrl;

cssLink.Attributes.Add("rel", "stylesheet");

cssLink.Attributes.Add("type", "text/css");

this.Page.Header.Controls.Add(cssLink);

// Add class name

this.CssClass = "WhoIsLooking";

使用Ajax

WhoIsLooking控件采用Ajax技术实时显示访客信息,Ajax是Asynchronous Javascript和 XML的缩写,利用这个技术可以在不刷新整个页面的情况下实现客户端与服务器端之间的数据传送。为了在ASP.NET自定义控件中实现Ajax需要完成以下三个步骤:
1 使用 GetCallbackEventReference()发起客户端请求;
2 实现ICallBackEventHandler 接口响应客户端的请求,这个接口有两个方法需要实现:RaiseCallbackEvent()方法以及GetCallbackResult()方法。
3 创建Javascript客户端函数获取返回的数据并进行相应的操作。

WhoIsLooking每5秒钟发起一次请求,需在OnPreRender()方法中添加以下代码:

string callback = Page.ClientScript.GetCallbackEventReference

(

this,

null,

"WhoIsLooking.UpdateDisplay",

String.Format("'{0}'", this.ClientID),

"WhoIsLooking.CallbackError",

true);

string startupScript = String.Format("setInterval( /"{0}/", {1} );", callback, _PollingInterval * 1000);

Page.ClientScript.RegisterStartupScript(this.GetType(), "WhoIsLooking", startupScript, true); 
    接下来需要重写RaiseCallbackEvent() 及GetCallbackResult()方法,RaiseCallbackEvent()方法将当前用户加入访客列表,同时也将离开的用户从列表中删除。GetCallbackResult()返回访客的信息,包括用户帐号,姓名,停留时间,浏览器信息,主机名,操作系统信息等。该方法的返回值为一个JSON数组,JSON是Ajax请求中表示信息的标准格式(关于JSON的更多介绍,请访问json.net)。例如,如果同时有两个用户正在浏览当前网页,JSON的值将会是这样:

[{userId:"fooglm45cjcycw55qi4yluvk",userName:"SUPEREXPERT//Steve", duration:"0 minute(s)", browser: "IE 7.0", remoteHost: "superexpert.com", platform: "WinXP"},{userId:"1kqatn55sxc4vi55ummxghil",userName:"SUPEREXPERT// Bill", duration:"0 minute(s)", browser: "Firefox 1.5.0.11", remoteHost: "superexpert.com", platform: "WinXP"}]    
    最后,WhoIsLooking控件通过UpdateDisplay()方法在客户端显示用户信息,该方法为每一个用户创建一个<div>层存放用户信息。

asp.net 自定义控件的更多相关文章

  1. ASP.NET自定义控件组件开发 第五章 模板控件开发

    原文:ASP.NET自定义控件组件开发 第五章 模板控件开发 第五章 模板控件开发 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...

  2. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 第四章 组合控件开发CompositeControl 大家好,今天我们来实现一个自定义的控件,之前我们已经 ...

  3. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl  后篇 --事件冒泡 系列文章链接: ASP.NET ...

  4. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇 第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列 ...

  5. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    原文:ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇 第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是 ...

  6. ASP.NET自定义控件组件开发 第一章 第三篇

    原文:ASP.NET自定义控件组件开发 第一章 第三篇 第三篇:第一章的完结篇 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待 ...

  7. ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件

    原文:ASP.NET自定义控件组件开发 第二章 继承WebControl的自定义控件 第二章 继承于WebControl的自定义控件 到现在为止,我已经写了三篇关于自定义控件开发的文章,很感谢大家的支 ...

  8. ASP.NET自定义控件组件开发 第一章 第二篇 接着待续

    原文:ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 ASP.NET自定义控件组件开发 第一章 第二篇 接着待续 很感谢大家给我的第一篇ASP.NET控件开发的支持!在写这些之前,我也看了 ...

  9. ASP.NET自定义控件组件开发 第一章 待续

    原文:ASP.NET自定义控件组件开发 第一章 待续 第一章:从一个简单的控件谈起 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.NET自定义控件组件开发 第一章 第二篇 接 ...

随机推荐

  1. ios下移除原生样式

    之前遇到过这个问题,今天无意中在网上看见博文 记录一下. 设置这个就好: -webkit-appearance : none ;

  2. 《BI那点儿事》数据流转换——透视

    这个和T-SQL中的PIVOT和UNPIVOT的作用是一样的.数据透视转换可以将数据规范或使它在报表中更具可读性. 通过透视列值的输入数据,透视转换将规范的数据集转变成规范程度稍低.但更为简洁的版本. ...

  3. Claims Identity

    using System;using System.Collections.Generic;using System.Linq;using System.Security.Claims;using S ...

  4. HTTP中的摘要认证机制

    引子: 指定和服务器端交互的HTTP方法,URL地址,即其他请求信息: Method:表示http请求方法,一般使用"GET","POST". url:表示请求 ...

  5. java高薪之路__005_IO流

    参考地址: 1. http://blog.csdn.net/yczz/article/details/38761237 File类 ObjectInputStream && Objec ...

  6. 程序设计入门——C语言 第5周编程练习 1高精度小数(10分)

    1 高精度小数(10分) 题目内容: 由于计算机内部表达方式的限制,浮点运算都有精度问题,为了得到高精度的计算结果,就需要自己设计实现方法. (0,1)之间的任何浮点数都可以表达为两个正整数的商,为了 ...

  7. Hbase之修改表结构

    import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impo ...

  8. linux笔记:文件系统管理-fdisk分区

    fdisk命令分区过程: 1.添加新硬盘 2.查看新硬盘: fdisk -l 3.使用fdisk命令分区: fdisk 硬盘设备文件名(如:fdisk /dev/sdb) fdisk交互指令说明: 4 ...

  9. HashMap其实就那么一回事儿之源码浅析

    上篇文章<LinkedList其实就那么一回事儿之源码分析>介绍了LinkedList, 本次将为大家介绍HashMap. 在介绍HashMap之前,为了方便更清楚地理解源码,先大致说说H ...

  10. 二分图最大权最小权完美匹配模板KM

    在网上找了一份挺好的模板,先标一下哦~链接君:http://blog.csdn.net/abcjennifer/article/details/5844579 #include <iostrea ...