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

87

实际上这是一个两部分的问题。第一,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属性来解决了此问题,但我仍然很好奇为什么上述方法不可行。

编译器错误是: Cannot convert System.Web.HttpContext to ...IWebBase via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion or null type conversion。

4个回答

147

不,根据MSDN关于HttpContext.Current的描述:“获取或设置当前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)。 - mike nelson

16

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


0

我在工作中使用相同的代码,但是因为不了解工作细节而感到非常烦恼。因此,我为我的工作开发了这个代码。 我认为将代码放在这里可以帮助那些有同样问题的朋友。感谢John Saunders。 - Amin Ghaderi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接