2009-06-16 6 views
1

Nous avons un ensemble de code qui va être utilisé dans ASP.NET autonome et SharePoint. Je me demande s'il existe un moyen légitime d'écrire du code conditionnel dans le fichier CS pour détecter si SharePoint est présent?détecter si un ASCX/ASPX s'exécute dans SharePoint?

Il doit pouvoir s'exécuter dans ou avant OnPreInit, car en fonction de cette décision, nous allons changer l'attribut MasterPageFile, et cela doit être fait au début du cycle de vie de la page. Je suppose que je peux faire quelque chose comme vérifier l'existence d'un répertoire "~/layouts", etc. mais il doit y avoir une meilleure façon de le faire. Et d'ailleurs, qui sait - pour des raisons de compatibilité (emplacement des images, etc.), nous pourrions effectivement adopter la structure de répertoires SharePoint dans le mode autonome ASP.NET.

Il est possible d'avoir besoin de Microsoft.SharePoint.DLL même s'il est pratiquement inutilisé lors de l'utilisation de Standalone.

Merci!

Répondre

7

Puisque vous êtes autorisé à faire référence Microsoft.SharePoint:

using Microsoft.SharePoint; 
// ... 

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

Modifier - autre approche prenant en considération NullReferenceException:

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

qui précède suppose que l'exception que vous avez mentionné est jeté lors de l'accès à SPContext, pas plus tôt.

+0

Malheureusement, j'ai essayé cela, et il se bloque sur une machine qui n'a pas réellement installé SharePoint. C'est correct pour moi de référencer la DLL, mais cela doit fonctionner quand le SP lui-même n'est pas présent. –

+0

Voici le trace de la pile pour ceux qui sont curieux - [NullReferenceException: objet de référence non définie à une instance d'un objet.] Microsoft.SharePoint.Utilities.SPUtility.AlternateServerUrlFromHttpRequestUrl (url Uri) +27 de Microsoft.SharePoint.Administration. SPAlternateUrl.get_ContextUri() +135 Microsoft.SharePoint.WebControls.SPControl.SPWebEnsureSPControl (contexte HttpContext) +237 de Microsoft.SharePoint.WebControls.SPControl.GetContextWeb (HttpContext contexte) +25 Microsoft.SharePoint.SPContext.get_Current() + 107 –

+0

Si l'exception que vous avez mentionnée est levée lorsque vous accédez à SPContext.Current, alors ma 2ème approche ci-dessus pourrait fonctionner pour vous. La solution de Nat ci-dessous est meilleure d'un point de vue architectural, cependant. –

2

Je me demande s'il est préférable de ne pas inclure la DLL SharePoint dans votre code ASP.NET normal. Si vous fractionnez/sous-classez le bit SharePoint et que vous incluez deux cibles de construction, vous devriez pouvoir ajouter au code supplémentaire nécessaire pour SharePoint sans désintégrer votre build ASP.NET.

+0

Merci Nat, et je comprends votre point de vue. Je pense que c'est une idée assez intelligente de faire une classe partielle et de l'associer à deux implémentations différentes. Mais il est déjà assez difficile de partager mes cours, je ne suis pas sûr que cela en vaille la peine. Je soupçonne que nous allons utiliser la logique if (IsSharePoint) {..} else {..} pendant un moment et ensuite, revisiter pour savoir où diviser la classe comme vous l'avez suggéré. –

Questions connexes