从HttpContext获取当前的System.Web.UI.Page?
这实际上是一个两部分问题。 首先,HttpContext.Current是否对应于当前的System.UI.Page对象?
第二个问题可能与第一个问题有关,那就是为什么我不能使用以下来查看当前页面是否实现了一个接口:
private IWebBase FindWebBase() { if (HttpContext.Current as IWebBase != null) { return (IWebBase)HttpContext.Current.; } throw new NotImplementedException("Crawling for IWebBase not implemented yet"); }
一般情况下,一些控件需要知道它们是作为SharePoint webpart执行还是作为Asp.Net框架的一部分执行。
我已经通过要求控件传递一个引用给自己,并检查控件的Page属性来解决这个问题,但是我仍然很好奇为什么上面的代码不起作用。
编译器错误是:无法将System.Web.HttpContext转换为… IWebBase通过引用转换,装箱转换,拆箱转换,包装转换或空types转换。
不,来自HttpContext.Current上的MSDN:“获取或设置当前HTTP请求的HttpContext对象”。
换句话说,它是一个HttpContext对象,而不是一个Page。
您可以通过HttpContext使用以下命令来访问Page对象:
Page page = HttpContext.Current.Handler as Page; if (page != null) { // Use page instance. }
你正在寻找HttpContext.Handler
。 由于Page实现了IHttpHandler,因此您将获得对当前正在执行的页面的引用。您必须投射它,或者至less尝试将其转换为您要查找的特定types。
HttpContext.Current
只是返回HttpContext.Current
的单例实例。 因此,它不是,也不可能是一个页面。
如果您需要当前正在执行的精确页面,则可能需要使用HttpContext.Current.CurrentHandler
。 例如,发送了一个Default.aspx的请求,但是会抛出一个错误,并且您将执行Response.Transfer
到您的自定义ErrorHandler.aspx页面。 CurrentHandler
将返回ErrorHandler.aspx的实例(如果在错误后调用),而HttpContext.Current.Handler
将返回Default.aspx的实例。
请看我的回答:
为什么HttpContext.Current.Handler是null?
也许解决了你的问题。