SharePoint C# et Javascript

Aller au contenu | Aller au menu | Aller à la recherche

dimanche 21 août 2016

Url pour se reconnecter avec un autre utilisateur

Pour ceux qui sont passé de SharePoint 2010 à SharePoint 2013, un fonctionnalité, bien utile à nous autres administrateurs, a due vous manquer. Il s'agit de la fonctionnalité pour se reconnecter avec un autre utilisateur.

La solution la plus rapide pour retrouver cette fonctionnalité : utiliser plusieurs navigateurs.

Autrement, il existe une url qui peut vous aider :

/_layouts/closeconnection.aspx?loginasanotheruser=true

Un appel à cette URL va faire exactement la même chose que le feu-bouton "Se connecter en tant que".

Proposition de syntaxe C# pour un singleton

Le singleton est un pattern courant permettant d'avoir un objet unique pour tout les appels d'une propriété. Typiquement; on aura la propriété suivante :

private static object _obj;
public object Obj
{
get
{
if(_obj == null)
{
_obj = new object();
}
return _obj;
}
}

C'est la syntaxe standard. Ce que je propose pour remplacer ce code est plus court, tout en restant relativement compréhensibl

private static object _obj;
public object Obj {
   get
   {
      return _obj ?? (_obj = new object());
   }
}

Ce qui pourrait manquer pour comprendre cette ligne est que l'assignation d'une valeur à une variable renvoi cette même variable ; donc (_obj = new object()) renvoi _obj.

vendredi 29 juillet 2016

Vérifier l'existence d'un sous site

Une tâche relativement courante, lors de l'instanciation d'une feature par exemple, consiste à créer des sous-sites. En soit, cela n'a rien de trop complexe. Et pourtant, lorsqu'on fait çà un vendredi à 18h, on peut avoir des surprises.

Le code pour créer un sous web n'a rien d'exceptionnel :
rootWeb.Webs.Add("sousSite");
Est ce que c'est fini? Non. Si l'on relance une deuxième fois la fonctionnalité, voici ce qui se passe :

Error occurred in deployment step 'Activate Features': The Web site address "/sousSite" is already in use.

Effectivement, il ne faut pas oublier de vérifier si le web existe ou pas.

if(rootWeb.Webs["sousSite"] == null)
{
       rootWeb.Webs.Add("sousSite");
}

On rajoute un contrôle et le tour est joué (remarque : on pourrait aussi mettre un simple try/catch). Le problème du code ci dessus, c'est qu'il contient une fuite mémoire. Si on met un peu d'ordre dans tout çà, on obtient le code suivant ;

SPWeb web = null;
try
{
       web = rootWeb.Webs.Add("sousSite");
}
catch(Exception e)
{
       //un petit log pour le debug
       if(e.HResult != -2147024713) throw;
}
finally
{
       if(web != null) web.Dispose();
}

Bon, le code fonctionne, pas de fuite mémoire. En soit le code ci-dessus est satisfaisant. On pourrait presque en rester là :). Pour autant, il existe une autre façon de faire, qui est moins connu. Ceux qui font du JSOM l'on déjà surement rencontré malgré eux.

Soit le code suivant en SSOM:
SPWeb web = SPContext.Current.Web;
var parentWeb = web.ParentWeb;


Et le même en JSOM :
var clientContext = SP.ClientContext.get_current();
var parentWeb = clientContext.get_web().get_parentWeb();


Quel est la différence entre parentWeb JSOM et parentWeb SSOM? Le premier est un SPWeb, l'autre correspond à un SPWebInfo.
Je l'avoue, la première fois que j'ai utilisé la méthode get_parentWeb(), je suis parti du principe qu'elle retourne un objet SPWeb. S'en est suivi un après-midi de douleur et d’incompréhension.
SPWebInfo est une classe qui regroupe les principaux attributs liés à un SPWeb, mais sans l’implémentation IDispose. Parmi les propriété les plus intéressante, on trouve le titre, la description, l'URL et l'ID.

Au final, on obtient :
if(rootWeb.Webs.WebInfos.FirstOrDefault(a => a.Url == "sousSite") == null)
{
       rootWeb.Webs.Add("sousSite")?.Dispose();
}


A noter : le ?. fait partie du C# 6.0. Si vous êtes en C# 5.0-, il vous faudra d'abord bien vérifier que le web n'est pas null avant de le disposer.

In fine, deux choses à retenir :

  • Webs.Add(/**/) retourne un objet SPWeb instancié. N'oubliez pas d'appeler Dispose()
  • SPWebInfo est votre ami