技术开发 频道

使用js刷新UpdatePanel

  这里使用了ClientScript.GetPostBackEventReference,最终生成的前台代码如下:

function doRefresh() {
        __doPostBack(
'pnlTime','');
    }



  这样也能达到我们的目的。

  而这种方式相应的后台代码如下:

public partial class WebForm1 : System.Web.UI.Page
    {
        
protected void Page_Load(object sender, EventArgs e)
        {
            lblTime.Text
= DateTime.Now.ToString("hh:mm:ss");
        }
    }

         表明该种实现方式其实是利用了即使是异步postback,也会触发页面的完整生命周期的原理。

  虽然这种方式在简单情形下很有效,但也存在一个很严重的弊端:没有对应的处理回发事件的地方,像上面的例子就只能在Page_Load里处理。如果一个页面只有一个按钮会引起回发,那么我们也完全可以不用设置该按钮的OnClick事件,而在Page_Load等中进行处理。但是如果很多按钮呢,映射到上面的例子:如果还需要点击div显示完整的日期呢?这种方式就捉襟见肘了。

  这时候我想到了从UpdatePanel入手:如果UpdatePanel自身能处理回发事件就好了。于是一个自定义的UpdatePanel产生了:

namespace MyControls
{
    
public delegate void PostBack(string source);
    
public class MyUpdatePanel : UpdatePanel, IPostBackEventHandler
    {
        
public static object PostBackObj = new object();
        
public event PostBack PostBack
        {
            add
            {
                Events.AddHandler(PostBackObj, value);
            }
            remove
            {
                Events.RemoveHandler(PostBackObj,value);
            }
        }
        
#region IPostBackEventHandler Members

        
public void RaisePostBackEvent(string source)
        {
            
if( Events[PostBackObj] != null)
            {
                var handler
= (MyControls.PostBack) Events[PostBackObj];
                handler(source);
            }
        }

        #endregion
    }
0
相关文章