艾伟:Tip:自定义UpdatePanelTrigger

简介:   大家在使用UpdatePanel的时候有没有遇到过这种情况呢?  页面上放置着3到4的UpdatePanel,它们互相独立,并且UpdateMode都是Condition,这意味着没有哪个UpdatePanel每次都会更新。

  大家在使用UpdatePanel的时候有没有遇到过这种情况呢?

  页面上放置着3到4的UpdatePanel,它们互相独立,并且UpdateMode都是Condition,这意味着没有哪个UpdatePanel每次都会更新。大多数UpdatePanel都是由某个控件回发而更新,但是其中的一个例外。它没有哪个控件来触发它,它有自己的一套逻辑来判断是否更新。这段逻辑独立于其他控件。

  理论上,这段逻辑可以放在页面的某个生命周期里进行判断,例如OnLoad。但是如果,这个判断甚至必须放在PreRenderComplete之后呢?再者,如果我们真的很想把判断是否更新的逻辑给独立与页面的生命周期的阶段呢?

  那么我们可以自己定义一个UpdatePanel触发器。

  UpdatePanel触发器的作用自然是用于触发某个UpdatePanel的更新。在ASP.NET AJAX中,我们最常见的UpdatePanel触发器就是AsyncPostBackTrigger和PostBackTrigger。但是在某些需要的时候,我们可以定义自己的触发器。

  如果要定义一个UpdatePanel触发器,我们必须继承UpdatePanelTrigger抽象类,并实现它的HasTriggered方法。UpdatePanelTrigger还有一个virtual方法就是Initialize。这个方法会在UpdatePanel的OnInit或OnLoad阶段时调用,它的实现如果要涉及到生命周期方面的问题,则必须注意这一点。HasTriggered方法会在页面Render时——其实是在ASP.NET AJAX自定义的输出方法中被调用。我们可以在这里实现自己的逻辑。

  我们现在就来实现一个ProgramicTrigger,用于解决掀先前提出的问题。这个ProgramicTrigge的实现很简单,只有寥寥数行代码:

ProgramicTrigger
public class ProgramicTrigger : UpdatePanelTrigger
{
    private string _CheckMethod = null;
    public string CheckMethod
    {
        get { return _CheckMethod; }
        set { _CheckMethod = value; }
    }
    protected override bool HasTriggered()
    {
        if (this._CheckMethod != null)
        {
            Page page = this.Owner.Page;
            MethodInfo methodInfo = page.GetType().GetMethod(this._CheckMethod);
            return (bool)methodInfo.Invoke(page, null);
        }
        return false;
    }
}

 

  在HasTriggered方法中,如果用户指定了CheckMethod属性,则使用反射调用定义在页面中的相应方法,得到是否刷新的结果。其实在一开始,我并不想使用反射,而是想定义一个事件,在事件中进行判断。可惜如果使用了事件,在编辑模式下就无法使用XML来指定响应事件的方法了——对于非控件的对象,VS的编辑模式只能指定属性。

  ProgramicTrigger使用起来自然也非常方便:

aspx
<asp:UpdatePanel ID="UpdatePanel1" runat="server"
    UpdateMode="Conditional" ChildrenAsTriggers="false">
    <ContentTemplate>
        <%= DateTime.Now %>
        <asp:Button ID="Button1" runat="server" Text="Button" />
    
  ContentTemplate>
    <Triggers>
        <ext:ProgramicTrigger CheckMethod="CheckMethod" />
    
   Triggers>

    asp:UpdatePanel>
aspx.cs
public bool CheckMethod()
{
    // ...
}

 

  您可以尝试在CheckMethod中给出不同的实现,然后点击页面中的按钮,察看页面上显示的时间是否变化。

  ProgramicTrigger只是最简单的示例,如果需要的话,您不妨在开发过程中也自定义一个UpdatePanel触发器?

目录
相关文章
企业微信开发之获取media_id的值
企业微信开发之获取media_id的值
295 0
|
5月前
|
机器学习/深度学习 人工智能 NoSQL
人工智能平台PAI产品使用合集之save_summary_steps这个配置项我设置了值为50,为什么还是1000个step才记录一次summaries
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
机器人
Typecho弹出find Input author error怎么解决
Typecho弹出find Input author error怎么解决
100 0
|
SQL 关系型数据库 MySQL
活久见,为什么SHOW TABLE STATUS总是不更新2
活久见,为什么SHOW TABLE STATUS总是不更新
119 0
|
SQL 关系型数据库 MySQL
活久见,为什么SHOW TABLE STATUS总是不更新1
活久见,为什么SHOW TABLE STATUS总是不更新
SAP WM 明明为OBD创建成功了GroupNumber,却被提示该Group Number不存在?
SAP WM 明明为OBD创建成功了GroupNumber,却被提示该Group Number不存在?
SAP WM 明明为OBD创建成功了GroupNumber,却被提示该Group Number不存在?
|
传感器 编解码 安全
什么? Macbook 也有 Touch ID ! 原来都是因为它... | 众筹星探
自从 iPhone 有了 Touch ID ,你会发现指纹识别真的是一种简单好用的东西。它能让你不需要依靠冗长复杂的密码就能用简单地指纹进行解锁,又快又安全。但你有没有想过如果也能在你的 PC 甚至是 Macbook 上也配上指纹识别,那会是怎样?
182 0
什么? Macbook 也有 Touch ID ! 原来都是因为它... | 众筹星探
|
数据可视化 Python
【pypi开源项目文档】终极秘诀应对rst解析错误:The description failed to render in the default format of reStructuredText
前面雷学委给大家缕一缕了如何开发一个python库并导入运行, 基本完成了一个初步的库,还支持了命令行工具的发布。
472 0
【pypi开源项目文档】终极秘诀应对rst解析错误:The description failed to render in the default format of reStructuredText
|
Java
更新模板接口(alipay.pass.template.update)JAVA版本小样
官方接口文档:https://docs.open.alipay.com/199/105250/  接口描述:对于已经创建的模板,如果需要修改模板内容,可通过该接口修改,适用于修改模板内容。对于已经发布的模板,如果需要修改内容并同步到用户端,则应使用更新卡券接口 调用这个接口前,你肯定是先创建模板了的,  创建模板接口参考该帖:https://openclub.
559 12
|
.NET 开发框架 前端开发