2009-06-16 11 views
1

スタンドアロンのASP.NETとSharePointの両方で使用される一連のコードがあります。 SharePointが存在するかどうかを検出するために、CSファイルに条件付きコードを記述する正当な方法があるかどうか疑問に思っていますか?SharePointでASCX/ASPXが実行されているかどうかを検出しますか?

OnPreInitで実行できる必要があります。この決定に基づいて、MasterPageFile属性を切り替えるので、ページライフサイクルの早い段階で行う必要があります。

"〜/ layouts"ディレクトリなどの存在を確認するようなことができますが、これを行うにはより良い方法が必要です。さらに、互換性の理由(イメージの場所など)については、実際にはASP.NETのスタンドアロンモードでSharePointディレクトリ構造を採用する可能性があります。

スタンドアロンで実行しているときにほとんど使用されなくても、Microsoft.SharePoint.DLLは必要です。

ありがとうございます!

答えて

7

あなたがMicrosoft.SharePointを参照するために許可されているので:

using Microsoft.SharePoint; 
// ... 

if (SPContext.Current == null) 
    // Not running in SharePoint 
else 
    // Running in SharePoint 

編集 - 代替的なアプローチを考慮にNullReferenceExceptionを取っ:

bool runningInSharePoint = false; 
try 
{ 
    if (SPContext.Current != null) 
     runningInSharePoint = true; 
} 
catch (NullReferenceException e) 
{ 
    // SharePoint is not present on the system 
} 

上記は、あなたが言及した例外がスローされることを前提としてい以前はなくSPContextにアクセスするときに使用します。

+0

残念ながら、私はこれを試して、実際にSharePointがインストールされていないマシンでクラッシュします。 DLLを参照するのは大丈夫ですが、SP自体が存在しない場合は動作する必要があります。 –

+0

はここに興味がある人のためのスタックトレースです - [とNullReferenceException:オブジェクト参照オブジェクトのインスタンスに設定されていません。] Microsoft.SharePoint.Utilities.SPUtility.AlternateServerUrlFromHttpRequestUrl(ウリURL)+27 Microsoft.SharePoint.Administration。 SPAlternateUrl.get_ContextUri()+135 Microsoft.SharePoint.WebControls.SPControl.SPWebEnsureSPControl(のHttpContextコンテキスト)237 Microsoft.SharePoint.WebControls.SPControl.GetContextWeb(のHttpContextコンテキスト)25 Microsoft.SharePoint.SPContext.get_Current()+ 107 –

+0

上記の例外がSPContext.Currentにアクセスしたときにスローされた場合、上記の2番目の方法が有効です。しかし、以下のNatのソリューションはアーキテクチャ上の観点からは優れています。 –

2

ストレートASP.NETコードにSharePoint dllを含めないほうがよいかどうか疑問です。 SharePointビットを部分的/サブクラス化して2つのビルドターゲットを含める場合、ASP.NETビルドを巻き戻さずにSharePointに必要な余分なコードを取り入れることができます。

+0

ありがとうナット、あなたのポイントを理解しています。私は部分的なクラスを作り、それを2つの異なる実装と組み合わせることは、とても巧妙な考えだと思います。しかし、私のクラスを分割するのは難しいので、努力する価値があるとは思わない。私は、if(IsSharePoint){..} else {..}ロジックをしばらく使ってから、あなたが示唆したようにクラスを分割する場所を見つけ直すことにします。 –