如何获取aspx页面的HttpHandler?
例如,我的 test.aspx 代码隐藏在public class Test : System.Web.UI.Page [...]
之后
如果我致电new Test()
它没有返回与HttpApplication.Context.Handler
获得的HttpHandler完全相同的HttpHandler,可以在浏览 test.aspx
仅供参考(并且最终不是问题):我需要这样做,因为我将使用Server.Transfer(NewPageHandler)
答案 0 :(得分:1)
基本上,在您的情况下,Test
是实际Test.aspx
类的父级(即,ASPX文件被编译为继承自Test
的类)。
要获取Test.aspx
实例,一个选项是直接使用编译器:
BuildManager.CreateInstanceFromVirtualPath("~/Test.aspx", typeof(Test));
或者你可以使用PageParser.GetCompiledPageInstance
作为Murali Murugesan的建议,它们非常相同。
请注意,这并不是真正支持的("此API支持.NET Framework基础结构,不能直接在您的代码中使用。"),但它确实很有效。我实际上在我的代码中切换到了默认的PageHandlerFactory
,这更稳定了:
class LuPageHandlerFactory : PageHandlerFactory
{
public static LuPageHandlerFactory Instance = new LuPageHandlerFactory();
private LuPageHandlerFactory() { }
}
// Which lets me call this:
var handler =
LuPageHandlerFactory.Instance.GetHandler
(
HttpContext.Current, null, "~/Test.aspx", null
) as Test;
更简洁的方法就是使用HttpContext.Current.RewritePath("~/Test.aspx");
并传递HttpContext.Current.Items
中的数据。
我的引擎实际上使用了我提到的最后一种方法作为后备 - 如果LuPageHandlerFactory
方法抛出SecurityException
,我会回退到RewritePath
。
您还应该处理HttpCompileException
。
答案 1 :(得分:1)
您可以获得页面的已编译实例
System.Web.UI.PageParser
.GetCompiledPageInstance("~/YourPage.aspx",
HttpApplication.Server.MapPath("~/YourPage.aspx")
, HttpApplication.Context);