BaseFieldControl caching

J'avoue que cet article est plus un aide-mémoire pour moi-même car le problème sur lequel il porte est tellement spécifique qu'il risque peu de survenir dans un autre contexte ...

La situation
Vous développez un Custom Field pour un Content Type de publication héritant de Page. Ce Custom Field sera utilisé dans des Page Layouts. Le Custom Field doit gérer des postbacks et modifier son affichage selon le contexte.

Le problème
Votre Custom Field hérite de BaseFieldControl (pas le choix). Le code de votre Custom Field n'est exécuté que lors de la première requête par le premier utilisateur. Pour tous les affichages subséquents, votre code n'est pas exécuté.

La situation
BaseFieldControl supporte une cache au niveau de son rendu HTML. En effet, tant que la valeur pour ce champ pour un même SPListItem n'a pas été modifiée (ou que le Page Layout entre en mode édition), le dernier rendu HTML sera affiché à l'utilisateur et le code ne sera pas exécuté. Dans votre cas, ceci n'est pas souhaitable.

La solution (partielle)
BaseFieldControl expose une propriété Protected nommée CanCacheRenderedFieldValue. Ajouter ce code dans votre Custom Field devrait régler le problème :

Protected Overrides Sub OnInit(ByVal e As System.EventArgs) CanCacheRenderedFieldValue = False MyBase.OnInit(e) End Sub

La solution complète
Dans plusieurs cas, la cache devrait être désactivée et le problème réglé. Mais pas pour vous! Si vous avez utilisé FormField dans votre Page Layout pour placer les champs, le code que vous venez d'ajouter n'a aucun effet ! La dernière partie de la solution consiste à modifier le Page Layout pour remplacer FormField par le vrai type de votre CustomField.

Bonne chance...