我正在尝试为内部Web应用程序创建一个搜索表单,该表单将出现在大多数页面上。我将搜索表单放入ascx用户控件(SearchPanel.ascx),并使用PostBackUrl =“Default.aspx”配置搜索按钮。我还在用户控件上创建了一个公共事件处理程序,当单击“搜索”按钮时会触发该事件处理程序(这样我就可以处理直接从Default.aspx启动的搜索)。
通过SearchPanel.ascx中的事件处理程序查看Default.aspx时搜索工作正常。当我尝试从托管用户控件的其他页面进行搜索时,浏览器会发布到Default.aspx,但this.PreviousPage为null。因此,我无法检查IsCrossPagePostBack,也无法使用PreviousPage.FindControl(“搜索”)访问搜索表单的公共属性(文本和几个复选框)。
为了处理从用户控件发起的跨页回发,我还需要做些什么吗?
更新
如果我在Page_Load期间中断调试器并检查Request.Form集合,我可以看到从原始页面传递的表单值,以及似乎像ViewState一样加密/编码的__PREVIOUSPAGE值。
当我使用调试器逐步调试Page_Load时,结果相当奇怪。如果我在它检查PreviousPage!= null的行上进入,我可以看到它实例化请求来自的页面。一旦完成,它将返回到Default.aspx中的Page_Load的开头,并再次运行它。这一次,PreviousPage只是null。
我必须做一些愚蠢的事,但到目前为止我不知道它是什么。
情节变粗:
好的,用户控制细节结果有点像红鲱鱼。 Details.aspx页面接受一个查询字符串参数,指示要显示的项目。如果该参数为空,则重定向回Default.aspx。看来正在发生的事情是Default.aspx收到跨页回发,当它检查PreviousPage时,运行Details.aspx的Page_Load()方法。
但是,看起来查询字符串参数不会发送回Details.aspx,因此它会命中此错误检查代码并运行Response.Redirect()错误处理程序。
我需要做的是让Details.aspx检查它是否在跨页回发中作为PreviousPage执行,并跳过它通常会执行的大部分执行。我该如何检查这种情况? Page.IsPostBack似乎没有抓住它。
答案 0 :(得分:0)
好吧,事实证明我只需要在Details.aspx的Page_Load()中检查Page.IsCrossPagePostBack,然后如果它是真的则跳过一堆初始化。
然后就是在PreviousPage恰好是嵌套在2或3层母版页中的内容页面时尝试使用Page.PreviousPage.FindControl()的问题......显然,我只是在HttpContext中调整了一些东西。 Current.Items。