Yann GARIT – Technologies Microsoft & Co

29 août 2011

[SharePoint 2010] Problème lors d’un second postback dans une WebPart avec un UpdatePanel ou une SPGridView

Vous l’avez peut-être remarqué mais, lorsque vous ajoutez un bouton dans un UpdatePanel ou encore dans une SPGridView (qui utilise également ce mécanisme pour afficher les données), l’action du bouton ne fonctionne que la première fois. Il vous faut recharger complètement la page pour pouvoir le refaire marcher.

Après plusieurs recherches, j’ai pu trouver une explication assez vague : Le service JavaScript de SharePoint override l’action par defaut du formulaire afin de pouvoir gérer certains types d’URL, qui peuvent contenir des caractères sur deux octets, pour des scénarios de rappels asynchrones.

La solution est donc de désactiver cette solution par le biais d’un script simple :

<script type="text/javascript">
    _spOriginalFormAction = document.forms[0].action;
    _spSuppressFormOnSubmitWrapper = true;
</script>

Ce qui résoudra votre problème de second postback.

24 août 2011

[SharePoint 2010] Désactiver la restriction du Client Object Model (ECMAScript) pour les utilisateurs anonymes

L’utilisation du modèle objet client de SharePoint 2010 permet de facilement récupérer des données, cependant, vous avez peut-être remarqué que son utilisation en mode anonyme ne fonctionne pas.
Vous obtiendrez en effet un message d’erreur comme quoi la méthode “GetItems” a été désactivé par l’administrateur :

"ErrorMessage":"The method \"GetItems\" of the type \"List\" with id \"{xxxxxxx-xxxxxxx-xxx-xxx}\" is blocked by the administrator on the server."

Pour désactiver cette restriction, il faut aller voir du coté de SPClientCallableSettings.AnonymousRestrictedTypes.

Cette propriété référence toutes les méthodes qui sont restreintes dans le cas d’un accès par un utilisateur anonyme.

image

Nous pouvons voir, en y accédant en PowerShell, que la méthode “GetItems” est bien présente dans les méthodes restreintes.

 

(Lire la suite…)

29 janvier 2011

[SharePoint 2010] Extension de SPMetal

Comme vu dans mes articles précédents, il y a certains types de colonnes qui ne sont pas prises en charge lors de la génération du SPMetal, je vous ai déjà montré :

Ces méthodes, à rajouter dans votre fichier généré sont très utiles et faciles à instancier.

Cependant, dans le cas où vous devez rajouter plusieurs fois des listes ou des types de contenu. A chaque regénération, vous devez remettre ces méthodes au bon endroit dans la classe, et je peux vous dire, pour l’avoir fait, que ça prend pas mal de temps et que c’est très répétitif !

Une solution efficace et d’utiliser le Custom Mapping. Il va nous permettre, pour n’importe qu’elle liste ou type de contenu, de rajouter les fonctions nécessaires pour récupérer ce type de colonnes, et cela, une seule et unique fois.

Pour l’exemple, je vais vous montrer un dernier type non pris en charge, qui est:  Type fichiers attachés. En mode Custom Mapping bien sûr.

Il s’agit des SPAttachmentCollection de l’assembly Microsoft.SharePoint.

Il s’agit donc ici d’étendre la classe généré par SPMetal et de rajouter nos propres champs en plus, pour cela, la classe custom mapping prévoit 3 fonctions : MapTo, MapFrom et Resolve.

  • MapFrom pour la lecture (READ). => GET
  • MapTo pour l’écriture (WRITE). => SET
  • Resolve pour la mise à jour (UPDATE).
public partial class Contact : Item, ICustomMapping
{
    private const string CONTENT_FIELD = "Attachments";
    private SPAttachmentCollection _contentAttachments;
    public SPAttachmentCollection ContentAttachments
    {
    }

    [CustomMapping(Columns = new string[] { CONTENT_FIELD})]
    public void MapFrom(object listItem)
    {
    }

    public void MapTo(object listItem)
    {
    }

    public void Resolve(RefreshMode mode, object originalListItem, object databaseListItem)
    {
    }
}

(Lire la suite…)

26 janvier 2011

[SharePoint 2010] Corriger les limites de SPMetal : FieldType: HTML

Encore un champ non pris en compte par le SPMetal, c’est le type HTML.

Utilisé par les RichTextBox ,il faut pouvoir récupérer les valeurs, les couleurs/polices/images que l’on peut avoir dans ce type de champ.

Comme pour les champs taxonomiques, et les images, il faut juste utiliser une classe spécifique: Microsoft.SharePoint.Publishing.Fields.HtmlFiel dans votre fichier généré par SPMetal.

[Microsoft.SharePoint.Linq.ColumnAttribute(Name="col_PublishingHtml", Storage="_publishinghtml", FieldType="Html")]
public Microsoft.SharePoint.Publishing.Fields.HtmlField PublishingHtml {
       get {
        return this._publishinghtml;
       }
       set {
          if ((value != this._publishinghtml)) {
             this.OnPropertyChanging("PublishingHtml", this._publishinghtml);
             this._publishinghtml= value;
             this.OnPropertyChanged("PublishingHtml");
          }
        }
}
Et voilà, vous pouvez utiliser ce type de colonne sans problèmes.

22 janvier 2011

19 janvier 2011

[SharePoint 2010] Corriger les limites de SPMetal : FieldType: Image

Comme nous avons pu le voir dans l’article précédent, certains types de colonnes ne sont pas pris en compte lors de la génération de SPMetal, nous allons voir ici comment corriger les problèmes pour un type bien précis: Image.

Pour cela, rien de plus simple, une fois que vous avez repéré quels sont vos champs qui ne passeront pas, il suffit de compléter le fichier SPMetal généré.

Les champs de ce type dans SharePoint permettent d’avoir accès à différents attributs, ce n’est donc pas une simple URL de type string qui est stocké.

Pour l’instancier, il faut donc utiliser :  Microsoft.SharePoint.Publishing.Fields.ImageFieldValue, vous pouvez retrouver les propriétés sur msdn ici.

Il reste maintenant à remplacer:

[Microsoft.SharePoint.Linq.ColumnAttribute(Name="col_Thumbnail", Storage="_thumbnail", FieldType="Invalid")]
public virtual object Thumbnail {
   get {
     return this._thumbnail;
   }
   set {
     if ((value != this._thumbnail)) {
         this.OnPropertyChanging("Thumbnail", this._thumbnail);
         this._thumbnail = value;
         this.OnPropertyChanged("Thumbnail");
     }
  }
}

Qui devient :

[Microsoft.SharePoint.Linq.ColumnAttribute(Name="col_Thumbnail", Storage="_thumbnail", FieldType="Image")]
public Microsoft.SharePoint.Publishing.Fields.ImageFieldValue Thumbnail {
   get {
     return this._thumbnail;
   }
   set {
     if ((value != this._thumbnail)) {
         this.OnPropertyChanging("Thumbnail", this._thumbnail);
         this._thumbnail = value;
         this.OnPropertyChanged("Thumbnail");
     }
   }
}

Sans oublier de remplacer :

private object Thumbnail   (situé en haut de la classe)  par:

private Microsoft.SharePoint.Publishing.Fields.ImageFieldValue Thumbnail.

Et le tour est joué, vous aurez alors accès à toutes les propriétés du champ (l’url bien sûr, le texte alternatif, hyperlien, la description…).

16 janvier 2011

[SharePoint 2010] Repérer les limites de la génération SPMetal

Vous utilisez la génération SPMetal pour faire du Linq to SharePoint, afin de récupérer facilement le CRUD de n’importe qu’elle type de contenu (content type) ou liste de votre collection de sites SharePoint.

C’est un gain de temps considérable, très facile à mettre en place pour générer les entités.

Cependant, vous vous rendrez très vite compte qu’en cas d’utilisation plus avancées, qu’il y a certaines limites à l’utilisation de cette méthode.

En effet,  si vous avez des colonnes avec des images, des métadonnées ou encore des champs html, ils seront complètement absents de votre fichier généré.

Le but de cet article est de vous montrer comment repérer les colonnes qui ne passeront pas lors de la génération.

Il y a certaines commandes SPMetal que nous pouvons spécifier dans un fichier XML, c’est ce fichier qui permet d’interagir sur la création des classes. Une de ses particularités est de pouvoir spécifier une “Column element”, c’est à dire de pouvoir forcer la génération d’une colonne de liste ou de type de contenu même si elles seraient invisibles lors d’une génération normale. La génération est telle que si certaines colonnes ne sont pas prises en compte, la génération les supprimes directement du fichier.

Voici un exemple pour forcer une colonne de type ImageFieldValue, qui n’est pas pris en compte lors d’une génération classique.

<?xml version="1.0" encoding="utf-8"?>
<
Web xmlns
="http://schemas.microsoft.com/SharePoint/2010/spmetal">
<
ContentType Name
="Contact">
<
Column Name
="col_Thumbnail" />
</ContentType></Web
>

Et le résultat ainsi obtenu :

[Microsoft.SharePoint.Linq.ColumnAttribute(Name="col_Thumbnail", Storage="_thumbnail", FieldType="Invalid")]
public virtual object Thumbnail {
   get {
      return this._thumbnail;
   }
   set {
      if ((value != this._thumbnail)) {
            this.OnPropertyChanging("Thumbnail", this._thumbnail);
            this._thumbnail = value;
            this.OnPropertyChanged("Thumbnail");
      }
   }
}

Vous pouvez ainsi voir que le type n’est pas pris en compte.

Il vous suffira alors de changer les différents paramètres, le “FieldType”, le type de retour “object” afin de rendre la colonne fonctionnelle pour votre propre utilisation.

Nous verrons d’ailleurs par la suite, les différentes manières pour corriger ces limites de SPMetal pour chaque type de champ Sourire

14 septembre 2010

[SharePoint 2010] Faire une WebPart asynchrone

Dans une page SharePoint, il se peut que plusieurs WebParts soient disposées un peu partout.

Si vous lancez des requêtes sur des listes ou sur des bases de données par exemple, les temps de réponse peuvent être très longs, ce qui ralentira toute la page. Les temps de chargement seront de plus en plus longs pour l’utilisateur, puisqu’il faudra attendre la fin de tous les calculs pour que l’affichage apparaisse.

Si la WebPart n’est pas une des plus importantes, il y a une manière simple de la rendre asynchrone est ainsi nous pourrons charger la page très vite et avec un système de loading, faire apparaitre les données d’une WebPart plus gourmande quelques secondes après. L’utilisateur pourra alors parcourir la page tout en attendant que le dernier module se charge.

Il faut cependant savoir que le résultat de la callback, donc de l’événement, sera sous forme d’un “string”. Il faudra donc générer nous même le html afin de pouvoir afficher correctement des données. C’est le prix à payer pour pouvoir rentre votre WebPart asynchrone :)

Avec un peu plus de temps, nous pouvons réussir à réaliser ce que l’on souhaite.

Pour commencer, dans le code behind de votre WebPart, il faut override le Render afin d’afficher une image de chargement, le temps que la requête se fasse.

 

protected override void Render(HtmlTextWriter writer)
{
    // TODO: add custom rendering code here.
    this.datadiv = this.ClientID + "content";    writer.Write("<div id=\"" + this.datadiv + "\"><img src=\"_layouts/progressbar.GIF\" width\"300\"></div>");
}

(Lire la suite…)

[SharePoint 2010] Edition d’une page avec une webpart erronée

Il vous est surement déjà arrivé d’insérer une webpart dans une page de votre site SharePoint, mais malheureusement, il peut arriver qu’elle ne fonctionne pas du premier coup.

Et vu que vous êtes bien sûr en mode debug (CutomError = off…) , vous avez un bel écran jaune comme on les aime !

image 

La solution?

(Lire la suite…)

24 août 2010

[MS] Concours Windows Phone 7–ProgTV

Filed under: Windows Phone 7 — Tags:, , , — Yann Garit @ 22:51

Avec Dorian Lamandé nous participons au concours de développement sur Windows Phone 7 : Rendez vous ici : http://www.facebook.com/home.php#!/video/video.php?v=445160459896&oid=129459787073480 et cliquez sur “J’aime” pour nous soutenir !

C’est à vous de jouer Sourire

Articles Précédents »

Thème : Silver is the New Black. Un Blog WordPress.com.

Suivre

Get every new post delivered to your Inbox.