这实际上是一个两部分问题。首先,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。
答案 0 :(得分:140)
不,来自HttpContext.Current上的MSDN:“获取或设置当前HTTP请求的HttpContext对象。”
换句话说,它是一个HttpContext对象,而不是Page。
您可以使用以下方法通过HttpContext访问Page对象:
Page page = HttpContext.Current.Handler as Page;
if (page != null)
{
// Use page instance.
}
答案 1 :(得分:37)
您正在寻找HttpContext.Handler
。由于Page实现了IHttpHandler,因此您将获得对当前正在执行的页面的引用。您必须将其强制转换,或者至少尝试将其强制转换为您正在寻找的特定类型。
HttpContext.Current
只返回HttpContext的单例实例。因此,它不是也不可能是一个页面。
答案 2 :(得分:15)
如果您想要当前正在执行的精确页面,可能需要使用HttpContext.Current.CurrentHandler
。例如,发送了对Default.aspx的请求,但是抛出了错误,并且您对自定义的ErrorHandler.aspx页面执行了Response.Transfer
。 CurrentHandler
将返回ErrorHandler.aspx的实例(如果在错误之后调用),而HttpContext.Current.Handler
将返回Default.aspx的实例。
答案 3 :(得分:0)
请看我的回答:
Why HttpContext.Current.Handler is null?
也许解决了你的问题。