分享
 
 
 

从ASP.NET服务器控件插入客户端脚本

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

简介

尽管从技术角度讲,Microsoft? ASP.NET 服务器控件的所有功能都可以在服务器端执行,但通常情况下通过添加客户端脚本可以大大增强服务器控件的可用性。例如,ASP.NET 验证 Web 控件可以在服务器端执行所有的验证检查。但是,对于高版本浏览器,验证 Web 控件也会发送客户端脚本,以在客户端进行验证。这就是说,这些浏览器的用户可以获得响应效果更好的动态体验。

在开发 ASP.NET 服务器控件时,您不妨问问自己,如何才能通过使用客户端脚本来增强可用性。一旦找到可行的方案,其他要做的就是增强服务器控件的功能,以使其发送合适的客户端脚本。

ASP.NET 服务器控件可以发送两种客户端脚本:

客户端脚本块

客户端 HTML 属性

客户端脚本块通常是用 JavaScript 编写的,其中通常包含在发生特定的客户端事件时执行的函数。客户端 HTML 属性提供将客户端事件与客户端脚本联系在一起的方法。例如,以下的 HTML 页面中包含了客户端脚本块,脚本块中包含了名为 doClick() 的函数。该页面同时还包含一个按钮(通过

HTML 元素创建),这个按钮的 onclick 属性与 doClick() 函数绑定。也就是说,只要用户单击该按钮,就开始执行 doClick() 函数中的客户端代码。在本示例中,将显示一个弹出式对话框(图 1)。

图 1 是单击“Click Me!”按钮时 HTML 页面的屏幕快照

对于以上 HTML 页面中的客户端脚本,有几点值得注意。首先,客户端脚本块包含在 HTML 注释()中。之所以这样,是因为如果不将脚本块放入 HTML 注释中,那些不能识别脚本的旧式浏览器就会显示

在这段代码中, 标记中的 onclick="displayPopup()" 用于指明在单击按钮时,JavaScript 函数 displayPopup() 应该运行。

RegisterStartupScript() 方法可用于添加要在加载页面后运行的脚本块。通过这种方法添加的脚本块位于 Web 窗体的结尾处,因为必须在脚本运行前定义脚本要修改的 HTML 元素。也就是说,如果您要使用客户端脚本将焦点设置到文本框,必须确保文本框的 HTML 标记位于设置该文本框的焦点的脚本之前。例如,下面的 HTML 将显示一个文本框,并将焦点设置到该文本框:

相反,以下 HTML 不会将焦点设置到文本框,因为文本框是在脚本块“之后”定义的:

因此,RegisterStartupScript() 方法将 "; scriptBlock = scriptBlock.Replace("%%POPUP_MESSAGE%%", this.PopupMessage); Page.RegisterStartupScript(scriptKey, scriptBlock); } } } }

请记住下面两件事:首先,Enabled 和 PopupMessage 属性保存在 ViewState 中,这样在回传时这些值可以始终保持一致; 其次,在 OnPreRender() 方法中,用于脚本块的关键字是文本 intoPopupMessage: 加上控件的 UniqueID 属性。如果使用一个硬编码的关键字,则当页面中有多个控件时,只有第一个控件能够注册其脚本块,因此只显示一个弹出式对话框。通过在脚本块关键字中使用 UniqueID,就能保证该控件的每个实例都能获取其脚本块。

在注册脚本块之前,代码首先检查三个条件:

没有使用同一关键字注册的脚本。这当然是不可能的,因为每个控件实例都应该有一个 UniqueID 属性值。但是,不妨先练习使用 IsStartupScriptRegistered() 方法,然后再花时间创建和注册启动脚本。

控件的 Enabled 属性为 True。

页面没有被回传。这段代码只允许弹出式对话框在第一次加载页面时显示,而不是在每次回传页面时都显示。我们还可以增添更为灵活的功能,即为该控件添加一个布尔属性,以允许用户指定是否在回传时也生成弹出式对话框。

如果满足这三个条件,则脚本被指定,并且 PopupMessage 属性值被插入到脚本中适当的位置。最后,调用 Page 属性的 RegisterStartupScript() 方法,传入关键字及脚本代码。

PopupGreeting 代码可以从本文结尾处提供的下载中获得。该下载包括名为 ClientSideControlsAndTester 的 Visual Studio .NET 解决方案,其中包含两个项目:

ClientSideControls,包含 PopupGreeting 服务器控件

ClientSideTester,包括一个为测试 ClientSideControls 而设计的 ASP.NET Web 应用程序

ClientSideControls 项目编译后的程序集名为 ClientSideControls.dll。要在您自己的 ASP.NET Web 应用程序中使用 PopupGreeting 服务器控件,请将 ClientSideControls.dll 文件添加到您的 Web 应用程序的引用中。然后,在设计器中,右键单击 Toolbox(工具箱)并选择“Add/Remove Items . . .”(添加/删除项),再次选择 ClientSideControls.dll 文件。这样就向 Toolbox(工具箱)中添加了名为 PopupGreeting 的新项。然后,您可以从 Toolbox(工具箱)将该控件拖到设计器中。

图 2 显示了 PopupGreeting 控件添加到 Toolbox(工具箱)并添加到设计器后,Visual Studio .NET 的屏幕快照。Toolbox(工具箱)中的 PopupGreeting 控件用红色线圈出,设计器中的 PopupGreeting 输出用蓝色线圈出,在屏幕快照右侧的“Properties”(属性)窗格中可以查看 PopupGreeting 的属性。

图 2:PopupGreeting 服务器控件已添加到 ASP.NET Web 窗体页面

发送 ASP.NET 服务器 Web 控件的 HTML 属性

如上所述,有两种方法可以通过服务器控件发送客户端脚本:

通过使用客户端脚本块

通过 HTML 元素属性

在上一节中,我们探讨了如何使用 Page 类的 RegisterStartupScript() 和 RegisterClientScriptBlock() 方法向 ASP.NET Web 页面添加客户端脚本块。在最后这一节,我们了解如何将 HTML 元素属性添加到服务器控件的 HTML 元素。

在开始之前,请注意这种方法通常只适用于从 System.Web.UI.WebControls.WebControl 类导出的服务器控件,因为从这个类导出的控件会发送某些 HTML 元素。不发送 HTML 元素的服务器控件(如上一节中的 PopupGreeting 服务器控件),则不必写出 HTML 元素属性,因为这些控件运行时不会写出 HTML 元素。

WebControl 类包含一个将 HTML 元素属性添加到由 Web 控件发出的 HTML 元素的方法。该方法称为 AddAttributesToRender(),它只有一个输入参数,即 HtmlTextWriter 的实例。要向 Web 控件添加 HTML 属性,您可以使用 HtmlTextWriter 的以下两个方法之一:

AddAttribute()

AddStyleAttribute()

AddAttribute() 方法用于将 title、class、style 和 onclick 等 HTML 属性添加到 HTML 元素。AddStyleAttribute() 用于将样式设置添加到 HTML 元素,如 background-color、color 和 font-size 等。

AddAttribute() 有几个重载窗体,但在代码中,我们将使用以下窗体:AddAttribute(HtmlTextWriterAttribute, value)。第一个参数,即 HtmlTextWriterAttribute,应该是 HtmlTextWriterAttribute 枚举的成员。该枚举包含像 Align、Bgcolor、Class 和 Onclick 等项。您可以在 .NET Framework Class Library,HtmlTextWriterAttribute Enumeration 中找到完整的列表。value 输入参数用于指定分配给特定 HTML 属性的值。最后,如果您想添加一个 HtmlTextWriterAttribute 枚举中未定义的 HTML 属性,可以使用 AddAttribute() 方法的替代形式 AddAttribute(attributeName, value),其中的 attributeName 和 value 均为字符串。

为了运用该信息,我们创建一个作为确认按钮的服务器 Web 控件。确认按钮是一种提交按钮,当用户单击此按钮时,将显示一个弹出式对话框,询问用户是否确定要继续操作。用户可以单击“取消”,不提交窗体。此项功能对用于删除信息的按钮特别有用,因为最终用户(或网站管理员)可能会在无意中单击鼠标删除数据库中的条目,如果没有机会取消,将是非常令人烦恼的事。

为了减少工作量,我们从 System.Web.UI.WebControls.Button 类中导出 ConfirmButton Web 控件,因为这个类本身已完成了涉及呈现提交按钮的所有繁重工作。在导出的类中,我们只需添加一个属性,这样用户可以指定确认消息,然后覆盖按钮的 AddAttributesToRender() 方法,并添加一个属性以处理客户端事件 onclick。

首先,在 Visual Studio .NET 中创建一个新的 Web Control Library(Web 控件库)项目,或者在 ClientSideControls 项目中添加一个新的 Web Custom Control(Web 自定义控件)。ConfirmButton 类的完整源代码如下所示:

using System; using System.Web.UI; using System.Web.UI.WebControls; using System.ComponentModel; namespace ClientSideControls { ///

/// ConfirmButton 的摘要描述。 ///

[DefaultProperty("Text"), ToolboxData("")] public class ConfirmButton : Button { [Bindable(true), Category("Appearance"), DefaultValue("")] public string PopupMessage { get { // 检查 ViewState 中是否存在该项目 object popupMessage = this.ViewState["PopupMessage"]; if (popupMessage != null) return this.ViewState["PopupMessage"].ToString(); else return "Are you sure you want to continue?"; } set { // 指定 ViewState 变量 ViewState["PopupMessage"] = value; } } protected override void AddAttributesToRender(HtmlTextWriter writer) { base.AddAttributesToRender(writer); string script = @"return confirm(""%%POP

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有