2016-03-21 3 views
1

J'ai créé un validateur personnalisé dans Sitecore. Il s'exécute correctement, et je peux le déboguer et le parcourir.Pourquoi mon valideur personnalisé Sitecore ne peut-il pas lire l'élément tel qu'il a été modifié dans Content Editor?

J'ai étendu mon validateur de StandardValidator, qui à son tour s'étend de BaseValidator.

Dans mon validateur, je reçois l'article:

var item = GetItem(); 

GetItem est une méthode de BaseValidator. D'après mes lectures, c'est la méthode standard pour valider l'objet.

Le problème: l'élément que je récupère ne reflète pas les valeurs qui ont été modifiées dans Content Editor. Au lieu de cela, il semble simplement être l'élément de la base de données (ainsi, à quoi il ressemblait quand il a été chargé dans l'éditeur de contenu, sans refléter les modifications qui pourraient y avoir été apportées).

Ainsi, je ne peux pas valider. Pour valider les données qu'un éditeur peut avoir modifiées dans l'éditeur de contenu, je dois pouvoir voir ces modifications. Voyant comment l'objet se trouve dans la base de données en ce moment ne m'aide pas.

J'ai fait quelques débogage étendu, qui peut ou non être utile -

Je décompilé le noyau, et marchèrent à la fois StandardValidator et BaseValidator.

La méthode GetItem de BaseValidator fait ce que je suspecte - il obtient l'article de la base de données. Mais il l'exécute à travers une méthode appelée UpdateItem qui semble être destinée à superposer les valeurs entrées de Content Editor au-dessus des valeurs stockées (retournant ainsi un objet qui reflète exactement les données qui sont actuellement dans l'éditeur). C'est clairement ce que je veux.

Toutefois, UpdateItem apparaît uniquement pour superposer quelque chose si une propriété appelée ControlToValidate a une valeur ... et elle ne le fait jamais. J'ai essayé ce validateur à la fois comme validateur de champ et comme validateur d'élément. Je l'ai initié en sauvegardant un objet et en tabulant un champ. J'ai mis un point d'arrêt dans Visual Studio et une montre sur ControlToValidate. Une fois (inexplicablement) il avait une valeur de FIELD165901047 (ce qui correspondait à un champ ID dans l'éditeur de contenu), mais dans tous les autres cas, il a été null.

Ce que cela signifie est que UpdateItem fait effectivement rien, et l'élément est simplement retourné, car il se trouve actuellement dans une base de données, ce qui ne contribue pas - je suis en train de validateur valeurs saisies dans Éditeur de contenu avant sauver à la base de données.

Indépendamment de mon enquête (je crois que je comprends UpdateItem, mais je concède que je pourrais être misinterpeting, et je ne suis pas comptable des erreurs potentielles de décompilation), j'ai encore ce problème fondamental:

var item = GetItem(); 

Cela ne semble jamais renvoyer les valeurs de l'éditeur de contenu. Il renvoie l'article directement à partir de la base de données, ce qui ne m'aide pas.

+0

Avez-vous essayé quelque chose comme ça http://blog.building-blocks.com/technical-tips/creating-a-custom-sitecore -field-validator-in-vingt-minutes? –

+0

où avez-vous attribué le validateur? à un champ ou à un modèle? –

+0

@SitecoreClimber J'ai essayé les deux. Pour un modèle, je l'ai assigné aux valeurs standard du modèle. – Deane

Répondre

0

Dans mon validateur (un type de champ validateur) Je l'ai utilisé

var field = this.GetField(); 

pour obtenir une nouvelle valeur du champ pour valider. La même chose devrait fonctionner pour un validateur de terrain. C'est probablement un peu différent pour un validateur d'article mais je n'ai jamais écrit de validateur d'article.

C'est aussi une méthode du BaseValidator et renvoie une valeur du type Field. Vous pouvez l'affecter directement au type du champ cible souhaité, par ex. HtmlField (Sitecore a mis en place les opérateurs de coulée de sorte que vous pouvez le faire):

HtmlField htmlField = field;