【发布时间】: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