这实际上是一个由两部分组成的问题。首先,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 Web 部件执行,还是作为 Asp.Net 框架的一部分执行。

我已经通过要求控件传递对其自身的引用并检查控件的 Page 属性解决了该问题,但我仍然很好奇为什么上述方法不起作用。

编译器错误是:无法通过引用转换、装箱转换、拆箱转换、包装转换或 null 类型转换将 System.Web.HttpContext 转换为 ...IWebBase。

有帮助吗?

解决方案

不,来自 MSDN 上的 HttpContext.Current:“获取或设置当前 HTTP 请求的 HttpContext 对象。”

换句话说,它是一个 HttpContext 对象,而不是一个 Page。

您可以使用以下方法通过 HttpContext 获取 Page 对象:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}

其他提示

您正在寻找 HttpContext.Handler. 。由于 Page 实现了 IHttpHandler,因此您将获得对当前正在执行的页面的引用。您必须对其进行强制转换,或者至少尝试将其强制转换为您正在查找的特定类型。

HttpContext.Current 只是返回 HttpContext 的单例实例。因此,它不是也不可能是页面。

您可能想使用 HttpContext.Current.CurrentHandler 如果您想要当前正在执行的精确页面。例如,发送了对 Default.aspx 的请求,但抛出了错误,并且您执行了 Response.Transfer 到您的自定义 ErrorHandler.aspx 页面。 CurrentHandler 将返回 ErrorHandler.aspx 的实例(如果在错误后调用),而 HttpContext.Current.Handler 将返回 Default.aspx 的实例。

请看我的回答:
为什么 HttpContext.Current.Handler 为空?

也许解决了你的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top