【问题标题】:Cross-page postback: Prevent Response.Redirect() being called from within PreviousPage跨页回发:防止从 PreviousPage 中调用 Response.Redirect()
【发布时间】:2012-02-08 21:47:42
【问题描述】:

我正在尝试为将出现在大多数页面上的内部 Web 应用程序创建一个搜索表单。我将搜索表单放入 ascx 用户控件 (SearchPanel.ascx),并使用 PostBackUrl="Default.aspx" 配置搜索按钮。我还在用户控件上创建了一个公共事件处理程序,它在单击“搜索”按钮时触发(这样我就可以处理直接从 Default.aspx 启动的搜索)。

通过 SearchPanel.ascx 中的事件处理程序在查看 Default.aspx 时进行搜索可以正常工作。当我尝试从托管用户控件的不同页面进行搜索时,浏览器会发布到 Default.aspx,但 this.PreviousPage 为空。因此,我无法检查 IsCrossPagePostBack,也无法使用 PreviousPage.FindControl("Search") 访问搜索表单的公共属性(文本和几个复选框)。

为了处理从用户控件发起的跨页回发,我还需要做些什么吗?

更新:

如果我在 Page_Load 期间中断调试器并检查 Request.Form 集合,我可以看到从原始页面传递的表单值,以及似乎像 ViewState 一样加密/编码的 __PREVIOUSPAGE 值。

当我使用调试器单步执行 Page_Load 时,结果相当奇怪。如果我进入它检查是否 PreviousPage != null 的行,我可以看到它实例化了请求来自的页面。完成后,它会返回到 Default.aspx 中 Page_Load 的开头,并再次运行它。这一次,PreviousPage 为空。

我一定是在做一些愚蠢的事情,但到目前为止我还不知道它是什么。

情节变厚:

好的,用户控制的细节被证明是一个红鲱鱼。 Details.aspx 页面接受一个查询字符串参数,该参数指示要显示的项目。如果该参数为空,它将重定向回 Default.aspx。看来发生的事情是 Default.aspx 收到跨页回发,当它检查 PreviousPage 时,运行 Details.aspx 的 Page_Load() 方法。

但是,查询字符串参数似乎没有发送回 Details.aspx,因此它会遇到此错误检查代码并运行 Response.Redirect() 错误处理程序。

看来我需要做的是让Details.aspx 检查它是否在跨页面回发中作为PreviousPage 执行,并跳过它通常会执行的大部分执行。我如何检查这种情况? Page.IsPostBack 似乎没有捕捉到它。

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    好吧,原来我只需要在 Details.aspx 的 Page_Load() 中检查 Page.IsCrossPagePostBack,如果它是真的,则跳过一堆初始化。

    然后,当 PreviousPage 恰好是嵌套在 2 或 3 层母版页中的内容页面时,尝试使用 Page.PreviousPage.FindControl() 的问题……显然,我只是解决了在 HttpContext 中混杂的问题。 Current.Items。

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      相关资源
      最近更新 更多