質問

これは実際には 2 つの部分からなる質問です。まず、HttpContext.Current は現在の System.UI.Page オブジェクトに対応していますか?

2 番目の質問は、おそらく最初の質問に関連していますが、現在のページがインターフェイスを実装しているかどうかを確認するために次のコマンドを使用できないのはなぜでしょうか。

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 オブジェクトを取得または設定します。

つまり、これは Page ではなく HttpContext オブジェクトです。

以下を使用して、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 が null になるのはなぜですか?

もしかしたらあなたの問題は解決したかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top