1

是否可以Page.PreviousPage在通用 .ashx 处理程序中检索 .aspx 页面的跨页面 PostBack 的等价物?

我需要从执行 PostBack 的页面访问一些 POST 值,并且 - 虽然我可以简单地使用Request.Form- 有问题的值来自 WebControls,因此,它们的名称相当模糊(而且不是很健壮)(例如 ctl00$WebFormsContent$SomeControl $SomeOtherControl$txtWhatever)。

我尝试了以下方法:

public void ProcessRequest(HttpContext context)
{
    Page previous = context.PreviousHandler as Page;
    if (previous != null)
        context.Response.Redirect("http://www.google.com");
}

但是,这不起作用 - 在调试时,我可以看到它context.PreviousPage是空的。

有没有办法检索此信息并将其转换为Page?

4

1 回答 1

3

这里PreviousHandler不会帮助你。要让您的 HttpHandler 接收跨页 PostBack,您必须了解它的底层工作原理。

参考:将用户重定向到另一个页面

跨页发布类似于超链接,因为传输是由用户操作发起的。但是,在跨页面发布中,目标页面是使用 HTTP POST 命令调用的,该命令将源页面上的控件值发送到目标页面。此外,如果源页面和目标页面在同一个 Web 应用程序中,则目标页面可以访问源页面的公共属性。与往常一样,应用程序中的所有页面都可以共享存储在会话状态或应用程序状态中的信息。

阅读该位后会清楚,您要查找的所有值实际上都作为 POST 变量发送到您的处理程序。

您可以在context.Request.Params集合中找到它们。

现在您已经收到了来自页面的请求,让我们在处理程序中说 Page1.aspx;我们需要创建一个可以处理和处理这个请求的对象。这是您的 Page1 对象的一个​​实例。

string pagePath = "~/Page1.aspx";                   //virtual path to your page
Type type = BuildManager.GetCompiledType(pagePath); //find the type

//create an object of your page
Page myPage = (Page)Activator.CreateInstance(type); 
myPage.ProcessRequest(HttpContext.Current);         //process the request

使用对象处理当前请求后,您会发现 Controls 集合已填充并填充了输入数据。您现在可以使用公开的属性或FindControl查找必要的控件并从中获取输入。

于 2013-04-08T12:48:02.053 回答