从HttpContext获取当前的System.Web.UI.Page吗?
时间:2020-03-05 18:51:59 来源:igfitidea点击:
这实际上是一个两部分的问题。首先,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。
解决方案
回答
我们正在寻找HttpContext.Handler
。由于Page实现了IHttpHandler,因此我们将获得对当前正在执行的页面的引用,我们必须将其强制转换,或者至少尝试将其强制转换为要查找的特定类型。
HttpContext.Current仅返回HttpContext的单例实例。因此,它不是而且永远不可能是页面。
回答
否,来自HttpContext.Current上的MSDN。"获取或者设置当前HTTP请求的HttpContext对象。"
换句话说,它是HttpContext对象,而不是Page。
我们可以使用以下方法通过HttpContext到达Page对象:
Page page = HttpContext.Current.Handler as Page; if (page != null) { // Use page instance. }