asp.net 自定义控件

在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 自定义控件

时间: 2024-08-17 14:25:20

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

Asp.Net 自定义控件实现图片的上传,浏览,删除功能

4月的时候公司比较闲,就想着自己做点东西,其实主要是为了更加熟悉.Net,毕竟接触的时间不长,趁着有时间想提高提高.不过当我做到图片上传这个功能的时候,就有些停滞不前了,连续写了两天也达不到自己想要的标准.后来公司来活,然后就没有然后了,然而做事总不能半途而废吧~时隔一个多月,趁着这个周末,我再次拾起了这个项目,而首要工作就是攻破这个图片上传控件. 下面说说我的标准是什么子的吧~ 1.最多可以上传三张图片,超过三张有提示. 2.点击图片小图,有图片放大功能,再次点击,图片恢复原来尺寸. 3.在图

Asp.Net 自定义控件实现图片的上传,浏览,Delete功能

4月的时候公司比较闲,就想着自己做点东西,其实主要是为了更加熟悉.Net,毕竟接触的时间不长,趁着有时间想提高提高.不过当我做到图片上传这个功能的时候,就有些停滞不前了,连续写了两天也达不到自己想要的标准.后来公司来活,然后就没有然后了,然而做事总不能半途而废吧~时隔一个多月,趁着这个周末,我再次拾起了这个项目,而首要工作就是攻破这个图片上传控件. 下面说说我的标准是什么子的吧~ 1.最多可以上传三张图片,超过三张有提示. 2.点击图片小图,有图片放大功能,再次点击,图片恢复原来尺寸. 3.在图

Asp.net 自定义控件开发相关的几种嵌入资源解决方案

前提: 如下将要介绍的几种类型资源都要在其属性页窗口, 将 <生成操作> 属性, 设置为[嵌入的资源], 如图: ? 给自定义控件添加自定义图标的几种方案 方法一: 直接在自定义控件项目中添加一个 *.bmp格式的图标文件, 并将其命名 与主控件文件相同, 扩展名为 .bmp, 比如主控件文件名为: CustomButton.cs, 则图标文件命名为: CustomButton.bmp . 编译项目. 然后在工具箱中添加此控件就可以看到刚刚设置的图标效果. 方法二: 图标文件名称与主控件名称不

ASP.NET自定义控件加载资源WebResource问题

最近项目用日期控件,想把My97的资源文件跟TextBox封装成一个DatePicker控件,其实很简单的意见事情,但是还是用了一天多的时间,主要的问题就是解决资源文件加载的问题.通过一天多的努力,得出下面的结论: 1.自定义控件中,一般只要加载JS文件,但是所有的资源文件都需要在AssemblyInfo.cs中注册.具体方式如下: 1.1.控件中注册JS文件代码: /// <summary> /// 注册JS /// </summary> /// <param name=&

ASP.NET - 自定义控件处理页面事件(控件与页面数据交互)的方法

//用委托的方法实现 //控件代码 public delegate void DelegateFunction( string sPageTitle ); private DelegateFunction delegateChangePageTitle = null; public DelegateFunction ChangePT { get { return delegateChangePageTitle; }set { delegateChangePageTitle = value; }

ASP.NET自定义控件入门Demo

最近看了MSDN关于自定义控件的介绍,根据官方的文档,自己学着做了一个简单的Demo给需要的朋友参考. ASP.NET 源生的TextBox是不带Label标签的,这里我要实现的是创建一个带Label标签的TextBox,并且默认填充Text值为GUID(只读) 实际上现在很多第三方组件都有这种控件,如Ext.Net,FineUI等等.这里只是为了学习了解自定义控件的开发. 步入正题 1.在VS2010中创建一个类库项目,我选择的框架是3.5.名称“MyTextBoxControl” 2.然后新

[转]ASP.NET自定义控件复杂属性声明持久性浅析

在自定义控件的开发过程中,我们经常要给控件添加一些复杂类型的属性.利用声明持久性(Declarative Persistence)可使得页面开发人员能够让页面开发人员在ASP.NET页面中,声明性地设置这些复杂属性值,而无需编写任何C#或者VB.NET代码. 参见下面的例子: GridView的DataKeyNames属性,其数据类型是string[]: <asp:GridView ID="GridView1" runat="server" DataKeyNa

asp.net 自定义控件 嵌入资源文件 备忘

要想在自定义用户控件中嵌入资源,从以下几个步骤入手: 1.在AssemblyInfo.cs中注册资源,文件夹层级用点隔开.例如: [assembly: System.Web.UI.WebResource("FirsteLite.OMS.Checking.UserControls.test.jpg", "image/jpg")] 2.修改资源文件的"生成操作"的值为“嵌入的资源". 3.在代码里引用的时候可以用Page.ClientScr

ASP.net 自定义控件GridView

1 using System; 2 using System.Web.UI; 3 using System.Web.UI.WebControls; 4 using System.Web.UI.HtmlControls; 5 using System.Collections; 6 using System.Collections.Generic; 7 using System.Text; 8 using System.Web.UI.Design; 9 using System.ComponentM