Hello World
Spiga

Tip:自定义UpdatePanelTrigger

2007-03-19 10:27 by 老赵, 5498 visits

大家在使用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的实现很简单,只有寥寥数行代码:

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使用起来自然也非常方便:

<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>
public bool CheckMethod()
{
    // ...
}

 

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

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

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

8 条回复

  1. KiddLee
    *.*.*.*
    链接

    KiddLee 2007-03-19 11:47:00

    感谢,通过这片文章也学道了UpdatePanel的一些运行机理

  2. Cat Chen
    *.*.*.*
    链接

    Cat Chen 2007-03-19 13:18:00

    不错的东西,应该是非常有用的一个Trigger,不过有个疑问——直接声明CheckMethod为string类型是否合适?是不是应该再写个TypeConverter来将delegate转换为string,然后CheckMethod就应该是一个delegate。

  3. 老赵
    admin
    链接

    老赵 2007-03-19 13:26:00

    @KiddLee
    一点点吧……:)

  4. 老赵
    admin
    链接

    老赵 2007-03-19 13:28:00

    @Cat Chen
    嗯,我倒没想到。现在作为演示的话ProgramicTrigger已经可以了,使用的时候应该可以再修改一下……

  5. duhaha[未注册用户]
    *.*.*.*
    链接

    duhaha[未注册用户] 2007-03-23 14:11:00

  6. Ajax初学者[未注册用户]
    *.*.*.*
    链接

    Ajax初学者[未注册用户] 2008-07-28 09:10:00

    <ext:ProgramicTrigger CheckMethod="CheckMethod" />
    大哥这个怎么用啊.我在页面上打不出来这个.

  7. 老赵
    admin
    链接

    老赵 2008-07-28 10:03:00

    @Ajax初学者
    熟悉一下asp.net的<@ Register />指令吧。

  8. Ajax初学者[未注册用户]
    *.*.*.*
    链接

    Ajax初学者[未注册用户] 2008-07-28 12:29:00

    @Jeffrey Zhao
    大哥可以给我一个DEMO吗,小弟感激不尽.
    yxivan@126.com
    谢谢.

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我