2013-04-08 63 views
1

是否有可能在通用.ashx处理程序中检索等效于Page.PreviousPage,跟随从.aspx页面开始的跨页PostBack?上一页.ashx处理程序

我需要从执行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

+0

也许尝试引荐人的财产? – 2013-04-08 12:36:37

+0

@EladLachmi我可以用这种方式得到上一页的URL;然而,这不会等同于'Page.PreviousPage',因为没有维护视图状态。 – 2013-04-08 12:42:32

+0

即使可以获取页面对象,我也不认为viewstate会被维护。如果你需要该页面的数据,那么做一个帖子怎么样? – 2013-04-08 12:46:00

回答

3

PreviousHandler不会帮你在这里。为了让你的HttpHandler接收一个跨页面PostBack,你必须了解它的基本工作原理。

参见:Redirecting Users to Another Page

跨页投递类似于超链接,该转移是由用户操作启动 。但是,在跨页面发布中,使用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 

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

+0

您好nunespascal - 的确,我可以通过'Request.Form'访问我想要的值;但是,这些值都是从WebControl发布的,因此具有通常不太明显的POST变量名称(ctl00 $ WebFormsContent $ ...),我宁愿避免硬编码。 – 2013-04-08 12:52:25

+0

啊,我明白你的意思了。让我即兴答复。 – nunespascal 2013-04-08 12:53:57

+0

添加了动态创建页面对象以处理发布数据的步骤。现在您应该可以从中获取任何数据,就像您使用'PreviousPage'一样 – nunespascal 2013-04-08 13:02:59