我使用UpdateMode = Conditional
在同一页面中使用多个UpdatePanel,并且我试图找到一种干净的方法来仅执行与UpdatePanel相关的后续代码,该代码将被更新。
因此,当我从JS调用__doPostBack
时,我能够在代码背后检测要求使用Request["__EVENTTARGET"]
刷新的UpdatePanel的名称(它为我提供了UpdatePanel的ClientID
。
但是当我调用UpdatePanel1.Update()
方法(从服务器端)时,是否有内置的方法来了解更新面板是否即将更新?
答案 0 :(得分:0)
我在这里发帖给我自己我的临时(?)答案。
因为显然无法检测UpdatePanel是否正在更新(当UpdatePanel由后面的代码更新时),我已经创建了一个处理更新的类,并放了一些会话中的数据,因此,同一个类将能够判断UpdatePanel是否正在更新。
所以,我不再直接调用UpdatePanel.Update()
,而是UpdatePanelManager.RegisterToUpdate()
。
方法bool isUpdating()
能够判断UpdatePanel是否正在更新,并且可以使用HttpContext.Current.Request["__EVENTTARGET"]
自动判断updatePanel是否通过Javascript更新。
注意:isUpdating()
需要在OnPreRender
Page事件中使用。
public static class UpdatePanelManager
{
private const string SessionName = "UpdatePanelRefresh";
public static void RegisterToUpdate(System.Web.UI.UpdatePanel updatePanel)
{
updatePanel.Update();
if (HttpContext.Current.Session[SessionName] == null)
{
HttpContext.Current.Session[SessionName] = new List<string>();
}
((List<string>)HttpContext.Current.Session[SessionName]).Add(updatePanel.ClientID);
}
public static bool IsUpdating(System.Web.UI.UpdatePanel updatePanel)
{
bool output = false;
// check if there is a JavaScript update request
if (HttpContext.Current.Request["__EVENTTARGET"] == updatePanel.ClientID)
output = true;
// check if there is a code behind update request
if (HttpContext.Current.Session[SessionName] != null
&& ((List<string>)HttpContext.Current.Session[SessionName]).Contains(updatePanel.ClientID))
{
output = true;
((List<string>)HttpContext.Current.Session[SessionName]).Remove(updatePanel.ClientID);
}
return output;
}
public static bool IsUpdatingOrPageLoading(System.Web.UI.UpdatePanel updatePanel, System.Web.UI.Page page)
{
bool output = false;
if (!page.IsPostBack || IsUpdating(updatePanel))
output = true;
return output;
}
}