2

我有一个带有更新面板和一些代码隐藏事件处理程序的 asp.net 网络表单来处理部分回发。在这种情况下,一旦页面被浏览器部分呈现,Sys.WebForms.PageRequestManager.getInstance.add_endRequest 方法就会被执行。

问题是,当我将 Response.Redirect 行放入其中一个事件的代码隐藏中时,Sys.WebForms.PageRequestManager.getInstance.add_endRequest 事件不会执行。因此,页面完成执行后,繁忙的动画会继续显示。

特别是,我的代码隐藏事件处理程序将用户重定向到一个文件,这有效地导致浏览器下载该文件。只要该文件是图像文件,整个事情就可以正常工作,因为图像显示在浏览器的同一窗口中。当文件是浏览器要在 ms office 中打开的 ms office 文件时,就会出现问题。用户在对话框中点击“打开”或“保存”,文件在ms office中打开或保存在文件系统中,但由于没有执行Sys.WebForms.PageRequestManager.getInstance.add_endRequest,页面一直处于忙碌状态。

4

3 回答 3

1

问题与请求是部分页面请求有关。因为他们正在下载文件,所以将它们设为局部不会带来任何好处。相反,我会通过将它们添加为 PostBackTrigger 或以编程方式使用 ScriptManager 的 RegisterPostBack 方法来使“按钮”触发完整的回发。

于 2012-06-02T09:36:43.560 回答
0

好问题。我的建议不是在您的页面中执行 response.redirect,而是在新窗口中呈现导航到您的文件 /image 的 javascript。这样您的文件将在新窗口中自动下载,并且您的 Sys.WebForms.PageRequestManager.getInstance.add_endRequest 将被触发。

希望这有效。

于 2012-06-02T09:20:34.343 回答
0

我找到了解决方案。在这种情况下实际上不需要部分回发,因为当意图重定向到另一个页面时,不需要维护当前页面的状态/数据/gui。如果重定向的决定不是最终的而是有条件的,这不是一个解决方案。

简单的答案是进行完整的回发,而不是部分回发。要进行回发,只需在更新面板的回发触发器列表中添加控件或以编程方式:

protected void gvDocumentListGrid_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.DataItem != null)
        tsm.RegisterPostBackControl(e.Row.FindControl("lbNameFileGrid"));
}

当页面有一个名为 tsm 的工具包脚本管理器、一个名为 gvDocumentListGrid 的网格视图和一个模板字段控件 lbNameFileGrid。

于 2012-06-02T09:41:26.303 回答