这里使用了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");
}
}
__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
}
{
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
}