在使用AjaxControlTookit的控件时响应事件

背景

在《分清ASP.NET AJAX中的Extender和Behavior模型》一文中,我谈到了使 用AjaxControlTookit中控件的关键是客户端的各Behavior组件。微软官方推出 的示例都太过于重视演示效果,而忽略了实际使用中的问题——市场需要吧,要 让技术看上去吸引人,这么做无可厚非。但是作为一个实际开发产品的程序员, 如果要灵活地使用AjaxControlTookit中的组件,则必须了解该如何在客户端操 作各Behvaior对象的各个成员(属性、方法和事件等)。

在《分》文中,我举了一个操作ModalPopupBehavir对象的例子,这样显示和 隐藏模态窗口的功能就局限于在服务器端ModalPopupExtender中指定的控件了。 但是在这篇文章中,我想着重讲述一下在客户端操作那些组件事件的一些方法和 技巧。因为,服务器端那些Extender对于客户端Behavior组件的事件支持并没有 我们期望得那么良好。

Extender组件对于Behavior属性的支持

为什么AjaxControlToolkit中的控件使用起来那么方便?因为我们有了那么 多的Extender。有了丰富的Extender控件,开发人员就可以在服务器端进行编程 ——例如设置各种属性,最终Extender会在页面中写入一些脚本用于创建客户端 的Behavior对象。例如如果我们要使用ModalPopupExtender,最简单的情况下我 们只需要在Extender中指定TargetControlID和PopupControlID就可以了,如下 :

<asp:Button ID="Button1" runat="server" Text="Button" />
<asp:Panel ID="Panel1" runat="server" Height="50px" 

Width="125px">
  Hello World!
</asp:Panel>
<ajaxToolkit:ModalPopupExtender runat="server" 

TargetControlID="Button1" PopupControlID="Panel1" />

一行多余的代码页不要写,Extender会自动在页面上引入所需的脚本文件, 并生成如下的客户端代码(格式有所改变):

Sys.Application.add_init(function()
{
  $create(
    AjaxControlToolkit.ModalPopupBehavior,
    {
      "PopupControlID":"Panel1",
      "dynamicServicePath" : "/Default.aspx",
      "id":"ctl02"
    },
    null,
    null,
    $get("Button1"));
});

于是,在客户端的init阶段就会创建客户端的对象(init阶段在 window.onload事件执行之后才会开始,因此如果页面上的资源需要大量时间才 能完成加载的话,用户会发现Behavior的效果会很晚才出现——不过我们先不关 心这个)。一般来说,页面上有多少个Extender,客户端就会出现多少个类似的 语句。在$create方法的第二个参数是一个在页面上用JSON表示的对象,这是需 要设置的Behavior对象的属性集合。例如在上面的例子中,ModalPopupBehavior 对象的PopupControlID属性会被设置为"Panel"。

有过AjaxControlToolkit中控件开发经验的朋友一定知道,会被输出到客户 端作为Behavior属性的那些Extender的属性都被标记了 ExtenderControlPropertyAttribute,例如在ModalPopupExtender中就有如下的 成员定义:

[ExtenderControlProperty]
public string PopupControlID
{
  get { ... }
  set { ... }
}

这样,AjaxControlToolkit中定义的基础类库就会把这个属性的值作为客户 端Behavior的值,并将其输出至客户端——控件开发人员和控件使用者双方皆大 欢喜。

有人说:我要响应事件

客户端的Behavior除了属性之外还有各种事件——例如CalendarBehavior的 shown事件,它会在日历被打开之后触发。利用事件我们就可以在合适的时候执 行特定的代码,获得丰富的功能。在服务器端标记属性然后输出至客户端早已众 人皆知,那么我们可以在服务器端指定客户端的事件吗?

以前不行,不过现在已经可以了。在上一个版本AjaxControlToolkit中新增 了和属性差不多的支持功能。现在AjaxControlToolkit中包含了一个 ExtenderControlEventAttribute类,它的作用就是在服务器端标记某个属性, 使它与某个客户端的事件对应。这样我们就可以在服务器端设置客户端某个事件 的响应方法,我们只需要保证那个方法存在并且逻辑正确即可。

例如,我们这次使用CaledarExtender作为示例:

<asp:TextBox ID="TextBox1" 

runat="server"></asp:TextBox>
<ajaxToolkit:CalendarExtender runat="server" 

TargetControlID="TextBox1"
  OnClientShown="onShownHandler"/>
<textarea id="TraceConsole" cols="50" 

rows="10"></textarea>
<script language="javascript" type="text/javascript">
  function onShownHandler(sender, args)
  {
    Sys.Debug.trace("Calendar shown.");
  }
</script>

目前我在服务器端的CalendarExtender中指定了OnClientShown属性,于是在 页面上就出现了如下的JavaScript代码:

Sys.Application.add_init(function()
{
  $create(
    AjaxControlToolkit.CalendarBehavior,
    {"id":"ctl02"},
    {"shown":onShownHandler},
    null,
    $get("TextBox1"));
});

$create方法的第三个参数是响应事件方法的集合,其中onShownHandler被作 为shown事件的响应方法。因此,在每次Calendar被展开之后onShownHandler方 法都会被执行,于是在页面上的TextArea中就会显示出“Calendar shown.”的 字样。

服务器端OnClientShown属性和客户端shown事件的映射关系是由 CalendarExtender中以下代码决定的:

[DefaultValue("")]
[ExtenderControlEvent]
[ClientPropertyName("shown")]
public virtual string OnClientShown
{
  get { ... }
  set { ... }
}

ExtenderControlEventAttribute标记表明该属性将会映射到客户端Behavior 的某个事件,而ClientPropertyNameAttribute标记则会接受一个参数,表明具 体是哪个事件(如果不标记的话,则使用和属性同名的事件)。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索客户端
, 控件
, 事件
, 属性
, AjaxControlToolkit
, CalendarExtender
, Behavior
ModalPopupExtender
ajax control toolkit、listcontrol 响应选中、control center未响应、servlet响应ajax请求、ajax响应时间过长,以便于您获取更多的相关知识。

时间: 2024-08-31 02:16:09

在使用AjaxControlTookit的控件时响应事件的相关文章

activex-ActiveX如何添加对话框上控件的响应事件

问题描述 ActiveX如何添加对话框上控件的响应事件 使用MFC创建一个ActiveX控件AAA,然后添加一个Dialog资源,双击添加Dialog类CNewDlg,在AAACtrl.cpp的OnDraw函数中调用CNewDlg的DoModal()函数,此时activeX控件会展示一个对话框. 如果在对话框中添加一个按钮,在单击时,控件的容器可以接收到此事件通知,请问应该怎么做?也就是说怎么把dialog的操作,通过事件传递给容器,即把dialog的操作与AAACtrl的事件关联起来? 解决方

关于多个控件的响应事件

问题描述 关于多个控件的响应事件 在一个项目中,如果有几十个控件的ID需要得到并且每个控件都有自己的点击响应事件,我是不是只能一个个的去声明并且用findviewbyId得到控件的ID,再然后每一个控件都给它写一个响应事件 有没有简单一点的方法 多谢 解决方案 DataList嵌入GridView,并响应子层控件的事件让ModalPopupExtender的控制控件能响应服务器事件GTK学习笔记之响应控件事件(5) 解决方案二: 截获程序消息队列,检索ID,消息,如果需要处理就处理.相同的处理就

ASP.net中动态加载控件时一些问题的总结

asp.net|动态|加载|控件|问题 经常见到有人说在ASP.net中不要使用动态控件,我想主要的原因在于使用动态控件会带来一些问题,在做项目的过程中,我将由动态加载控件引发的总是作了一个小小的总结.1 .在使用LoadControl加载控件后,用户控件中的某些控件不再响应事件. 这个问题主要是由于将控件加载放在if (!Page.IsPostBack)之内引起的,放在外面即可.在思归的blog上对此问题进行了详细的说明.2.用户控件中某些控件的响应出现问题,如某个按钮第一次选择时不触发CLI

使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容

原文:使用WebBrowser控件时在网页元素上绘制文本或其他自定义内容     第一次在CNBlogs上发Post是提出一个有关使用WebBrowser控件时对SELECT网页元素操作的疑惑,这个问题至今也没有解决,后来有朋友在该Post的评论里询问WebBrowser控件如何在网页元素上绘制文本的问题--但是由于我的懒惰,竟然已有半年时间没有浏览过自己的Blog,因此没有看到这位朋友的评论而不能及时提供回答,真是愧疚.       大家都见过VS.NET的WebForm设计器,当我们在设计器

如何解决“呈现控件时出错”的问题

在制作控件的时候容易遇到" 呈现控件时出错"" 发生了未处理的异常.未将对象引用设置到对象 的实例." 这样的错误,如下图:( 也有可能仅仅只是因为未设置runat="server" 标签而导致该错误, 请先检查该项.) 但是在编译时/ 运行时也都是没有错误的. 分析 如图所示的情况我们称之为" 设计时" 以区别于" 编译时"/" 运行时" . 设计时 :在ASP.NET 环境中也就是当

单击Button控件时,以对话框的形式弹出用户在TextBox中输入的值

问题描述 单击Button控件时,以对话框的形式弹出用户在TextBox中输入的值 新建一个aspx页面,命名为Alert.aspx,在页面添加一个TextBox控件和一个Button控件,当用户单击Button控件时,以对话框的形式弹出用户在TextBox中输入的值. 解决方案 在按钮里面写 ClientScript.RegisterClientScriptBlock(GetType(), "sas", "<script> alert('" + Tex

javascript-js中使用select控件时需要加上form吗?

问题描述 js中使用select控件时需要加上form吗? 在页面中,有表单form1 里面有一个select控件 名称为category.而在js中设置select时,如果document.category.options[tt]=new Option(""""");就无法创建成功. 但是使用document.form1.category.options[tt]=new Option(""""");就可以

自定义事件异步响应-自定义用户控件中,事件的异步响就

问题描述 自定义用户控件中,事件的异步响就 自定义一含有自定义事件的用户控件,当在异步情况下时,该事件的处理程序总是为null,怎么处理? 解决方案 对应事件的实例是否还有效.存在. 解决方案二: 什么叫事件的处理程序总是为null,仔细调试下,事件处理程序有没有传正确,应该同步等加载完了再执行.

dll动态库-MFC 动态创建控件不响应消息

问题描述 MFC 动态创建控件不响应消息 按照工程的要求,我必须建立一个类(动态链接库中),这个类是从CWnd派生的,里面的控件全部要求动态生成,而我这个类会作为一个Dialog的成员变量. 目前动态创建控件可以实现,但是控件却不响应消息,我认为是消息只在Dialog中,没法传到其成员变量中,不知道是不是这个原因--请大神帮忙! 我做了一个很简单的程序,请大神帮忙分析一下,灰常灰常感谢~ 解决方案 // MFCApplication1Dlg.h : 头文件 protected: CTestWnd