Response.Redirect在Ajax Code-Behind中

时间:2012-06-02 09:11:28

标签: asp.net ajax

我有一个带有更新面板的asp.net webform和一些代码隐藏事件处理程序来处理部分回发。在此类事件中,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未执行。

3 个答案:

答案 0 :(得分:1)

问题与部分页面请求的请求有关。因为他们正在下载文件,所以通过使它们变得偏袒没有任何好处。相反,我会通过将它们添加为PostBackTriggers或使用ScriptManager的RegisterPostBack方法以编程方式将“按钮”触发完全回发。

答案 1 :(得分:0)

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

希望这有效。

答案 2 :(得分:0)

我找到了解决方案。在这种情况下实际上不需要部分回发,因为当intent被重定向到另一个页面时,则不需要维护当前页面的state / data / gui。如果重定向的决定不是终极的,而是有条件的,那么这不是解决方案。

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

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

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

当页面有一个名为tsm的toolkitscript管理器,一个称为gvDocumentListGrid的gridview和一个模板字段控件lbNameFileGrid。