分享
 
 
 

利用MS AJAX 扩展服务器端控件

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

通过MS AJAX可以扩展一个服务器端控件在客户端呈现后的特性,使其界面更加友好。

实例代码:IScriptControl.rar

一、创建网站,选择ASP.NET AJAX-Enabled Web Site.

二、向项目中添加一个类,使其派生自TextBox,并实现IScriptControl接口。如下代码实例:

public class SampleTextBox : TextBox, IScriptControl

三、这个控件我们将实现两个属性:

HighlightCssClass 控件得到焦点后的样式。当控件得到焦点的时候使其能够高亮显示。

NoHighlightCssClass 失去焦点的控件的样式。

public string HighlightCssClass

{

get { return _highlightCssClass; }

set { _highlightCssClass = value; }

}

public string NoHighlightCssClass

{

get { return _noHighlightCssClass; }

set { _noHighlightCssClass = value; }

}

四、接口IScriptControl 的实现。

GetScriptDescriptors() 返回一个包含控件客户端实例的属性和事件句柄的 ScriptDescriptor 类型的数组。

GetScriptReferences() 返回一个包含控件客户端 JavaScript 代码的ScriptReference 类型的数组。

在这个实例中,我们用四个函数来实现这两个函数。代码入下:

protected virtual IEnumerable<ScriptReference> GetScriptReferences()

{

ScriptReference reference = new ScriptReference();

reference.Path = ResolveClientUrl("SampleTextBox.js");

return new ScriptReference[] { reference };

}

protected virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors()

{

ScriptControlDescriptor descriptor = new ScriptControlDescriptor("Samples.SampleTextBox", this.ClientID);

descriptor.AddProperty("highlightCssClass", this.HighlightCssClass);

descriptor.AddProperty("nohighlightCssClass", this.NoHighlightCssClass);

return new ScriptDescriptor[] { descriptor };

}

IEnumerable<ScriptReference> IScriptControl.GetScriptReferences()

{

return GetScriptReferences();

}

IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors()

{

return GetScriptDescriptors();

} 五、这册控件。代码比较简单,所以就不再多加讲述,入下:

protected override void OnPreRender(EventArgs e)

{

if (!this.DesignMode)

{

// Test for ScriptManager and register if it exists

sm = ScriptManager.GetCurrent(Page);

if (sm == null)

throw new HttpException("A ScriptManager control must exist on the current page.");

sm.RegisterScriptControl(this);

}

base.OnPreRender(e);

}

protected override void Render(HtmlTextWriter writer)

{

if (!this.DesignMode)

sm.RegisterScriptDescriptors(this);

base.Render(writer);

}

六、下边是我们新添加的类的完整代码:

using System;

using System.Data;

using System.Configuration;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Collections.Generic;

namespace TextBoxExtender

{

/**//// <summary>

/// SampleTextBox 的摘要说明

/// </summary>

public class SampleTextBox : TextBox, IScriptControl

{

private string _highlightCssClass;

private string _noHighlightCssClass;

private ScriptManager sm;

public string HighlightCssClass

{

get { return _highlightCssClass; }

set { _highlightCssClass = value; }

}

public string NoHighlightCssClass

{

get { return _noHighlightCssClass; }

set { _noHighlightCssClass = value; }

}

protected override void OnPreRender(EventArgs e)

{

if (!this.DesignMode)

{

// Test for ScriptManager and register if it exists

sm = ScriptManager.GetCurrent(Page);

if (sm == null)

throw new HttpException("A ScriptManager control must exist on the current page.");

sm.RegisterScriptControl(this);

}

base.OnPreRender(e);

}

protected override void Render(HtmlTextWriter writer)

{

if (!this.DesignMode)

sm.RegisterScriptDescriptors(this);

base.Render(writer);

}

protected virtual IEnumerable<ScriptReference> GetScriptReferences()

{

ScriptReference reference = new ScriptReference();

reference.Path = ResolveClientUrl("SampleTextBox.js");

return new ScriptReference[] { reference };

}

protected virtual IEnumerable<ScriptDescriptor> GetScriptDescriptors()

{

ScriptControlDescriptor descriptor = new ScriptControlDescriptor("Samples.SampleTextBox", this.ClientID);

descriptor.AddProperty("highlightCssClass", this.HighlightCssClass);

descriptor.AddProperty("nohighlightCssClass", this.NoHighlightCssClass);

return new ScriptDescriptor[] { descriptor };

}

IEnumerable<ScriptReference> IScriptControl.GetScriptReferences()

{

return GetScriptReferences();

}

IEnumerable<ScriptDescriptor> IScriptControl.GetScriptDescriptors()

{

return GetScriptDescriptors();

}

}

}

七、创建客户端控件。为客户端控件注册一个命名空间,并实现各个属性和事件:

// 为控件注册命名控件

Type.registerNamespace('Samples');

//

// 定义控件的属性

//

Samples.SampleTextBox = function(element) {

Samples.SampleTextBox.initializeBase(this, [element]);

this._highlightCssClass = null;

this._nohighlightCssClass = null;

}

//

// 为控件创建属性

//

Samples.SampleTextBox.prototype = {

initialize : function() {

Samples.SampleTextBox.callBaseMethod(this, 'initialize');

this._onfocusHandler = Function.createDelegate(this, this._onFocus);

this._onblurHandler = Function.createDelegate(this, this._onBlur);

$addHandlers(this.get_element(),

{ 'focus' : this._onFocus,

'blur' : this._onBlur },

this);

this.get_element().className = this._nohighlightCssClass;

},

dispose : function() {

$clearHandlers(this.get_element());

Samples.SampleTextBox.callBaseMethod(this, 'dispose');

},

//

// 事件委托

//

_onFocus : function(e) {

if (this.get_element() && !this.get_element().disabled) {

this.get_element().className = this._highlightCssClass;

}

},

_onBlur : function(e) {

if (this.get_element() && !this.get_element().disabled) {

this.get_element().className = this._nohighlightCssClass;

}

},

//

// 控件属性

//

get_highlightCssClass : function() {

return this._highlightCssClass;

},

set_highlightCssClass : function(value) {

if (this._highlightCssClass !== value) {

this._highlightCssClass = value;

this.raisePropertyChanged('highlightCssClass');

}

},

get_nohighlightCssClass : function() {

return this._nohighlightCssClass;

},

set_nohighlightCssClass : function(value) {

if (this._nohighlightCssClass !== value) {

this._nohighlightCssClass = value;

this.raisePropertyChanged('nohighlightCssClass');

}

}

}

// Optional descriptor for JSON serialization.

Samples.SampleTextBox.descriptor = {

properties: [ {name: 'highlightCssClass', type: String},

{name: 'nohighlightCssClass', type: String} ]

}

// Register the class as a type that inherits from Sys.UI.Control.

Samples.SampleTextBox.registerClass('Samples.SampleTextBox', Sys.UI.Control);

if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

最后将如下代码复制到Default.aspx页面,用以测试空间:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register Namespace="TextBoxExtender" TagPrefix="sample" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1" runat="server">

<title>ASP.NET AJAX Control Sample</title>

<style type="text/css">

.LowLight

{

background-color:#EEEEEE;

}

.HighLight

{

background-color:Ivory;

}

</style>

</head>

<body>

<form id="form1" runat="server">

<asp:ScriptManager ID="ScriptManager1" runat="server" >

<Scripts>

<asp:ScriptReference Path="JScript.js" />

</Scripts>

</asp:ScriptManager>

<div>

<table border="0" cellpadding="2">

<tr>

<td><asp:Label runat="server" ID="Label1" AssociatedControlID="TextBox1">Name</asp:Label></td>

<td><sample:SampleTextBox ID="TextBox1" runat="server" NoHighlightCssClass="LowLight" HighlightCssClass="HighLight" /></td>

</tr>

<tr>

<td><asp:Label runat="server" ID="Label2" AssociatedControlID="TextBox2">Phone</asp:Label></td>

<td><sample:SampleTextBox ID="TextBox2" runat="server" NoHighlightCssClass="LowLight" HighlightCssClass="HighLight" /></td>

</tr>

<tr>

<td><asp:Label runat="server" ID="Label3" AssociatedControlID="TextBox3">E-mail</asp:Label></td>

<td><sample:SampleTextBox ID="TextBox3" runat="server" NoHighlightCssClass="LowLight" HighlightCssClass="HighLight" /></td>

</tr>

</table>

<asp:Button runat="server" ID="Button1" Text="Submit Form" />

</div>

</form>

</body>

</html>

http://www.cnblogs.com/hblynn/archive/2007/01/29/633619.html

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有