确定哪个UpdatePanel导致部分(异步)PostBack?

Hom*_*mam 13 asp.net postback updatepanel

在一个页面中包含两个UpdatePanels,我怎么知道哪个UpdatePanel部分原因PostBack

我的意思是在Page_Load事件处理程序中.

这是我的代码:

 <asp:ScriptManager ID="ScriptManager1" runat="server">
 </asp:ScriptManager>
 <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" 
     onprerender="UpdatePanel1_PreRender">
     <ContentTemplate>
         <A:u1 ID="u1" runat="server" />
     </ContentTemplate>
 </asp:UpdatePanel>
 <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional" 
     onprerender="UpdatePanel2_PreRender">
     <ContentTemplate>
         <A:u2 ID="u2" runat="server" />
     </ContentTemplate>
 </asp:UpdatePanel>
Run Code Online (Sandbox Code Playgroud)

我尝试了这段代码,但它并没有用到!

protected void Page_Load(object sender, EventArgs e)
{
    if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack)
    {
        if (UpdatePanel1.IsInPartialRendering)
        {
            // never enter to here
        }
        if (UpdatePanel2.IsInPartialRendering)
        {
            // neither here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助!

Fré*_*idi 11

您可以使用UpdatePanel类的IsInPartialRendering属性来确定特定面板是否导致部分回发:

protected void Page_Render(object sender, EventArgs e)
{
    if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) {
        if (yourFirstUpdatePanel.IsInPartialRendering) {
            // The first UpdatePanel caused the partial postback.
        } else if (yourSecondUpdatePanel.IsInPartialRendering) {
            // The second UpdatePanel caused the partial postback.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:似乎IsInPartialRendering总是falseRender阶段之前.由于您在Load阶段期间需要该信息,因此无法按预期工作.看到这个bug.

这里记录了一个解决方法,包括从中UpdatePanel获取自己的类以访问其受保护的RequiresUpdate属性:

public class ExtendedUpdatePanel : UpdatePanel
{
    public bool IsUpdating
    {
        get {
            return RequiresUpdate;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

更换后asp:UpdatePanelExtendedUpdatePanel在你的页面的标记,上面的代码变成:

protected void Page_Load(object sender, EventArgs e)
{
    if (ScriptManager.GetCurrent(Page).IsInAsyncPostBack) {
        if (yourFirstUpdatePanel.IsUpdating) {
            // The first UpdatePanel caused the partial postback.
        } else if (yourSecondUpdatePanel.IsUpdating) {
            // The second UpdatePanel caused the partial postback.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


DEV*_*MBM 7

试试这个:

ScriptManager.GetCurrent().AsyncPostBackSourceElementID
Run Code Online (Sandbox Code Playgroud)

  • 这解决了我的问题.我使用了这样的if语句:if(ScriptManager.GetCurrent(Page).IsSnAsyncPostBack && ScriptManager.GetCurrent(Page).AsyncPostBackSourceElementID == control.UniqueID) - 你需要比较UniqueID而不是ClientID,如果你的更新面板包含更多比一个控件,你需要测试每个控件. (3认同)

小智 5

如果您不想扩展原始UpdatePanel类,也可以使用此解决方法:

string id = ScriptManager.GetCurrent(Page).AsyncPostBackSourceElementID;
Run Code Online (Sandbox Code Playgroud)

因此,您可以检查结果id并添加一些条件子句以确定应执行哪些代码.此id应该等于通过javascript函数传递的第一个参数__doPostBack('someid', '').

例如,我的更新面板中有一个用户控件:此控件包含一组触发UpdatePanel的链接按钮.)我也可以从一些外部链接手动更新此面板(使用类似的东西) __doPostBack('myUpdatePanelClientId', '');

也就是说,就我而言,我看到了加载UpdatePanel的三种不同方式:

  • 第一页加载;
  • 在我的UpdatePanel中单击链接按钮(或任何其他类型的按钮);
  • 在UpdatePanel外触发PostBack.

每个场景给我一个不同的身份.第一个给我一个空字符串(因为这是第一个页面加载,还没有用__doPostBack函数触发任何回发.)

第二个给了我在用户控件中推送的按钮的UniqueId(这是原始和预期的ASP.NET行为.)

第三个给出了我在编码方法时传递的第一个参数(即:UpdatePanel的ClientId).

以下是我成功实现UpdatePanel用例的方法(假设我使用的是部分呈现模式.)这并不完美,但它可以按预期工作.

protected void myUpdatePanel_Load(object sender, EventArgs e)
{
    string id = ScriptManager.GetCurrent(Page).AsyncPostBackSourceElementID;

    bool firstLoad = (String.IsNullOrEmpty(id));
    bool triggerFromUpdatePanel = !firstLoad && (id.Contains(userControlInsideMyUpdatePanel.UniqueID));
    bool triggerFromExternalControl = !firstLoad && (id == myUpdatePanel.ClientID);

    // case 1, 2, 3.
    if ((firstLoad)  || (triggerFromUpdatePanel)  || (triggerFromExternalControl ))
    {
        // do something
    }
    else 
    {
        // do nothing!
    }


}
Run Code Online (Sandbox Code Playgroud)