菜园子  

最近需要用到这么个功能, 网上找了找, 方法不少, 挑了一种最简单的记录下来:

首先, UpdatePanel里要声明一下OnLoad方法, 如下:

<asp:UpdatePanel ID="UpdatePanel1" runat="server"  OnLoad="UpdatePanel1_Load">
    <ContentTemplate>
	...	        
    </ContentTemplate>
</asp:UpdatePanel>

 

接着,在你需要触发UpdatePanel的时候通过如下方法

__doPostBack('<%= UpdatePanel1.ClientID %>', '');

 

我是在ajax里面调用的, 页面文档操作完成后调用他

$.ajax({
            type:"GET",
            url:"UserRelationAjaxCall.aspx",
            dataType:"text",
            data:"Type=UserGroup&RelationID="+relationId + "&UserGroupStr="+passStr.trim(),
            success:function(msg){
                    groupsArray =  msg.decodeURIComponent().split('|');
                    generateGroups();
                    $('#no_group').hide()
                    //Aysn refresh list panel
                    __doPostBack('<%= UpdatePanel1.ClientID %>', '');
                },
                error:function(msg){
                    alert("Error");
                }
        });

这样就是先局部刷新了.

再补充点知识:
开发人员常遇到的三种ajax问题:
1 .页面在局部postback时还是触发刷新了
2 .没有更新时updatepanel居然触发更新了
3 .Load事件完成后控件的事件被触发


1.页面在局部postback时还是触发刷新了:
很多开发人员不清楚的是,在局部postback中, 页面的所有生命周期中的事件全部会触发, 在页面局部回发过程中,页面的控件树会被重新建立并且每个控件都会执行其生命周期的事件,
在局部回发中, Page.IsPostBack is true . 但是ScriptManager.IsInAsyncPostBack is true 仅仅在局部回发中

2.每次UpdatePanel都会跟着更新
尽量使用UpdatePanel的生命周期事件, 像Init, Load, PreRender, Unload, 这样可以清楚的区分和更安全的使用__doPostBack, 如果不想每次都调用, 就在调用之前判断下:

protected void UpdatePanel1_PreRender(object sender, EventArgs e)
{
  // This code will only be executed if the partial postback
  //  was raised by a __doPostBack('UpdatePanel1', '')
  if (Request["__EVENTTARGET"] == UpdatePanel1.ClientID)
  {
    // Insert magic here.
  }
}

总结下,几点注意:

Page_Load每次都会执行, 在这一点上, 局部刷新和全页刷新没有区别
通过对_doPostBack, __EVENTTARGET 一起使用可以将刷新先定于特定目标(通常是子panel)

 

 

 
posted on 2010-12-24 16:16  菜园子  阅读(2202)  评论(0编辑  收藏  举报