从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?

也许解决了你的问题。