2009-11-18 5 views
2

Étant donné un objet SPListItem représentant un dossier, je dois déterminer s'il possède le type de contenu de dossier intégré ou un type de contenu de dossier personnalisé (avec des champs supplémentaires).Détection de types de contenu de dossier personnalisé dans MOSS2007

Voici ce que je fais

SPContentType folderType = aFolderItem.Web.AvailableContentTypes[SPBuiltInContentTypeId.Folder]; 
    SPContentType contentType = aFolderItem.ContentType; 

    if (contentType != folderType) 
     ... 

Cependant, pour les dossiers par défaut, je reçois toujours un type de contenu différent de celui du type construit. Ils ont des ID comme 0x0120007C34D9760794FA43AB267F4E1A1BF460. Je ne suis pas sûr d'où provient ce suffixe GUID particulier, je ne le trouve pas dans la définition du dossier my \ features.

Ma meilleure estimation est que les dossiers instanciés reçoivent toujours un type personnalisé. Si c'est le cas, toute suggestion sur la façon dont je pourrais faire la différence entre les dossiers intégrés et les dossiers personnalisés?

Répondre

1

Si un type de contenu est joint à une liste, il ne sera pas joint directement mais une copie de celui-ci sera créée et jointe. L'identifiant de type de contenu d'origine est ensuite annexé avec un Guid et devient le "nouveau" identifiant de type de contenu.

Si vous avez conservé la valeur guide lines for defining content type ids, l'ID de type de contenu de votre dossier personnalisé doit ressembler à 0x0120 + 00 + <Guid>. Par conséquent, si vous vérifiez le type de contenu d'un élément, qu'il s'agisse d'un dossier par défaut ou personnalisé, l'ID d'un dossier personnalisé ressemblera à 0x0120 + 00 + <Guid> ==> Type de contenu du dossier de base id + un guide pour l'attacher à une liste . Par contre, l'ID d'un dossier personnalisé ressemblera à 0x0120 + 00 + <Guid> + <Guid> ==> Type de contenu du dossier de base + un guide pour votre type de contenu personnalisé + un guide pour l'associer à une liste. Pour faciliter la comparaison, vous ne devez pas comparer l'ID du type de contenu réel, mais consulter l'ID du type de contenu parent id. Pour un dossier personnalisé l'ID des parents est 0x0120, pour un dossier personnalisé, il sera 0x0120 + 00 + <Guid>.

+0

Aha, merci de confirmer que c'est comme ça que ça fonctionne. Maintenant que j'y ai réfléchi un peu plus, c'est en fait assez évident (voir comment les types de contenu de la liste peuvent avoir des personnalisations qui sont séparées du type de contenu du site parent). Votre suggestion sur la façon de détecter les dossiers intégrés (appliqués) devrait fonctionner comme un charme. Excellent. –

1

En supposant que aFolderItem est la variable de type SPListItem ci-dessous le code devrait obtenir ce que vous voulez.

if(aFolderItem.ContentType.Id.IsChildOf(SPBuiltInContentTypeId.Folder)) 
      ...this is a Folder 
else 
      ...this is not a Folder 
+0

D'accord, mais je veux voir la différence entre les dossiers BUILTIN et les dossiers CUSTOM. Les deux seront certainement un enfant de SPBuiltInContentTypeId.Folder. –

+0

I.e. pas un enfant direct, mais un descendant. –

Questions connexes