在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. python走起之第一话

    Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  2. iOS - Mac Apache WebDav 服务器配置

    前言 Apache 服务器: Web 服务器,可以支持各种脚本(PHP)的执行,目前世界上使用最为广泛的一种 Web 服务器 WebDav 服务器: 基于 http 协议的 "文件" ...

  3. c语言期末复习题

    代码参考:<K&R> 1.单词计数 #include<stdio.h> #define IN 1 #define OUT 0 main() { int c, state ...

  4. iOS核心动画学习整理

    最近利用业余时间终于把iOS核心动画高级技巧(https://zsisme.gitbooks.io/ios-/content/chapter1/the-layer-tree.html)看完,对应其中一 ...

  5. redis 不能持久化问题 MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.

    转载自:http://www.cnblogs.com/anny-1980/p/4582674.html kombu.exceptions.OperationalError: MISCONF Redis ...

  6. 【转载】协同过滤 & Spark机器学习实战

    因为协同过滤内容比较多,就新开一篇文章啦~~ 聚类和线性回归的实战,可以看:http://www.cnblogs.com/charlesblc/p/6159187.html 协同过滤实战,仍然参考:h ...

  7. SQL Server常用语句

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  8. 工作中使用的html5和css3 新特性

    1.placeholder <input type="text" placeholder="请输入手机号码" class="phone" ...

  9. 运用vertical:middle 使得元素垂直居中

    我要垂直居中我要垂直居中我要垂直居中我要垂直居中我要垂直居中垂直居中垂直居中垂直居中中垂直居中垂直居中   <!-- 第一步:主题元素display:inline-block;第二步:插入辅助元 ...

  10. CentOs6.5下独立安装mysql篇

    1.安装包:Mysql: mysql-5.6.13.tar 一.源码包准备 (1)mysql-5.6.13.tar.gz 源码包.去www.mysql.com下载最新的mysql-5.6.13.tar ...