从HttpContext获取当前的System.Web.UI.Page吗?


84

这实际上是一个两部分的问题。首先,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。

Answers:


144

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

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

您可以使用以下方法通过HttpContext到达Page对象:

Page page = HttpContext.Current.Handler as Page;

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

2
否决票,因为不正确。HttpContext.Current.CurrentHandler的答案是正确的!如果您执行Server.Transfer,则HttpContext.Current.Handler将成为上一个页面,HttpContext.Current.CurrentHandler将成为当前页面
Mike

37

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

HttpContext.Current简单地返回HttpContext的单例实例。因此,它不是而且永远不可能是页面。


2
只是给任何阅读本文的人的便条。下面的答案是相同的,但有一个示例(即,您使用HttpContext.Current.Handler)。
麦克尼尔森

15

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.