ASP.NET服务器控件发送脚本(3)

从 ASP.net 服务器控件发送客户端脚本块
  
    请记住,ReGISterStartupScript() 和 RegisterClientScriptBlock() 方法是 System.Web.UI.Page 类的方法。幸运的是,可以容易地从 ASP.NET 服务器控件调用这两个方法,因为 System.Web.UI.Control 类(所有 ASP.NET 服务器控件都直接或间接地从这个类导出)有一个包含对 Page 实例的引用的 Page 属性,而这个 Page 实例包含服务器控件。因此,要从 ASP.NET 服务器控件添加客户端脚本块,您只需使用下面的语法:
  
  
  this.Page.RegisterClientScriptBlock(key, script);
  
    通常,添加客户端脚本块这个任务会使用 OnPreRender() 方法来处理,这个方法在控件生命周期的预呈现阶段执行。
  
    让我们创建一个只显示客户端弹出式对话框的 ASP.NET 服务器控件。此示例将说明构建一个发送客户端脚本的控件是很容易的。
  
    首先,在 Microsoft? Visual Studio? .NET 中创建一个新的 Web Control Library(Web 控件库)项目。这将创建一个只有一个类的新项目,这个类从 System.Web.UI.WebControls.WebControl 导出。但是,我们希望这个类从 System.Web.UI.Control 类导出。为什么呢?因为 WebControl 类用于支持显示为 HTML 元素的服务器控件,而 Control 类则用于不会显示为 HTML 元素的服务器控件。
  
    大多数内置的 ASP.NET 服务器控件都会发送一个 HTML 元素。例如,TextBox Web 控件发送一个 <input> 元素,其类型属性设置为 text;DataGrid Web 控件发送一个 <table> 元素,为每条要显示的记录发送 <tr> 元素,为每个字段发送 <td> 列。但是,不是所有的控件都需要发送 HTML 元素。例如,Literal 控件只是按原样输出它的 Text 属性,而不将这个属性放在 HTML 元素中。同样,Repeater 也不将其输出放在 HTML 元素中。那些显示为 HTML 元素的服务器控件,如 TextBox、Button、DataGrid 等等,是从 System.Web.UI.WebControls.WebControl 类导出的,而那些不产生 HTML 元素的控件,如 Literal、Repeater 等,是从 System.Web.UI.Control 类导出的。
  
    既然我们要创建的服务器控件不可见(它只是发送一个显示弹出式控件的客户端脚本块),这个控件最好从 System.Web.UI.Control 导出,而不是从 System.Web.UI.WebControls.WebControl 导出。
  
    这个控件只需要两个属性:
  
    PopupMessage - 表示要在弹出式对话框中显示的消息的字符串。
  
    Enabled - 表示是否启用控件的布尔值。如果启用控件,则显示弹出式对话框,否则不显示。(必须添加一个 Enabled 属性,是因为导出该控件的 Control 类不包括 Enabled 属性,此属性只是隐含地由那些从 WebControl 导出的控件使用。)
  
    除了这两种属性之外,我们需要覆盖 OnPreRender() 方法。在这里,我们需要调用 RegisterStartupScript(),并传递控件唯一的关键字和恰当的客户端脚本以显示弹出式对话框。这个类的完整代码如下所示:
  
  
  using System;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.ComponentModel;
  
  namespace ClientSideScript
  {
  /// <summary>
  /// WebCustomControl1 的摘要描述。
  /// </summary>
  [DefaultProperty("Text"),
  ToolboxData("<{0}:PopupGreeting runat=server></{0}:PopupGreeting>")]
  public class PopupGreeting : System.Web.UI.Control
  {
  [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 "Welcome to my Web site!";
  }
  
  set
  {
  // 指定 ViewState 变量
  ViewState["PopupMessage"] = value;
  }
  }
  
  [Bindable(true),
  Category("Appearance"),
  DefaultValue("")]
  public bool Enabled
  {
  get
  {
  // 检查 ViewState 中是否存在该项目
  object enabled = this.ViewState["Enabled"];
  if (enabled != null)
  return (bool) this.ViewState["Enabled"];
  else
  return true;
  }
  
  set
  {
  // 指定 ViewState 变量
  ViewState["Enabled"] = value;
  }
  }
  protected override void OnPreRender(EventArgs e)
  {
  base.OnPreRender(e);
  
  string scriptKey = "intoPopupMessage:" + this.UniqueID;
  
  if (!Page.IsStartupScriptRegistered(scriptKey) && this.Enabled &&
  !Page.IsPostBack)
  {
  string scriptBlock =
  @"<script language=""JavaScript"">
  <!--
  alert(""%%POPUP_MESSAGE%%"");
  // -->
  </script>";
  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 的属性。
  
  
  
    做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值