2009-10-17 8 views
0

J'essaie de créer un modèle de liste dans la fonction SharePoint à l'aide de CAML. Je deux types de contenu« Nouvelles » et « Nouvelles de presse » ils partagent deux champs appelés Présentation et Description de.Sharepoint ListTemplate Types de contenu multiples - Champs Ref

J'ai lu que l'élément caml "listtemplate" n'ajoute pas automatiquement les champs des types de contenu, vous devez spécifier tous les champs. Lorsque des champs sont spécifiés, SharePoint ne met pas à jour le paramètre "Used In" dans les paramètres de la liste SharePoint (screenshot). Ceci est un problème car les vues ne peuvent pas être mises à jour avec ces champs.

Est-ce que cela peut être résolu avec un récepteur de fonctions écrit en C#?

Des idées?

<?xml version="1.0" encoding="utf-8" ?> 
<Elements xmlns="http://schemas.microsoft.com/sharepoint/"> 
    <ListTemplate Name="News" 
       DisplayName="News" 
       Description="News" 
       Type="100" 
       BaseType="0" 
       OnQuickLaunch="true" 
       SecurityBits="11" 
       Sequence="410" 
       Image="/_layouts/images/itgen.gif" 
       Unique="True" 
       DisableAttachments="True" /> 
</Elements> 

<?xml version="1.0" encoding="utf-8" ?> 
<List Name="News" 
     Title="News" 
     FolderCreation="FALSE" 
     Direction="$Resources:Direction;" 
     Url="Lists/News" 
     EnableContentTypes="True" 
     BaseType="0" 
     Type="100" 
     xmlns="http://schemas.microsoft.com/sharepoint/" 
     xmlns:ows="Microsoft SharePoint"> 
    <MetaData> 
    <ContentTypes> 
     <ContentTypeRef ID="0x010007196C9EB6E5B04BAE108FD1969FD42B01" /> 
     <ContentTypeRef ID="0x010007196C9EB6E5B04BAE108FD1969FD42B02" /> 
    </ContentTypes> 
    <Fields> 
     <Field ID="{1E061768-0380-48e4-8E71-86CAE6DDDF30}" Type="Note" DisplayName="Overview" Name="Overviews" /> 
     <Field ID="{9406510E-511A-438f-AD9F-A55CED16B033}" Type="Note" DisplayName="Description" StaticName="Description" Name="Description" /> 
    </Fields> 
    <View> 
     Removed For Post 
    </View>   
    <Forms> 
     <Form Type="DisplayForm" Url="DispForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> 
     <Form Type="EditForm" Url="EditForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> 
     <Form Type="NewForm" Url="NewForm.aspx" SetupPath="pages\form.aspx" WebPartZoneID="Main" /> 
    </Forms> 
    </MetaData> 
</List> 

Répondre

1

Ceci est l'un des problèmes ayant CAML faire l'initialisation pour vous, je vais toujours pour faire des choses dans le code si possible :)

J'ai eu un problème similaire, l'autre jour et a fini par enlever la ContentTypeRef section de la liste, en laissant hériter juste de l'élément et dans un récepteur de fonctionnalités créant la liste, en ajoutant les types de contenu que je voulais, puis en supprimant le type de contenu de l'élément. De cette façon, la liste correctement renseignée avec les champs des types de contenu

Suite est mon récepteur caractéristique:

public void CreateList(SPFeatureReceiverProperties prop) 
     { 
      logger.Info("Creating list"); 
      using (SPWeb currentWeb = WebHelper.GetWeb(prop)) 
      { 
       try 
       { 
        SPList list = ListHelper.CreateList("Other Documents", "", "Rhb Other Documents List", true, currentWeb); 
        logger.Info("List created successfully"); 

        logger.Info("Attaching content types"); 
        list.ContentTypesEnabled = true; 
        list.Update(); 
        list.ContentTypes.Add(currentWeb.ContentTypes["RhbOtherDocuments"]); 
        list.Update(); 
        list.ContentTypes["Item"].Delete(); 
        list.Update(); 
        logger.Info("Content type attached"); 
       } 
       catch (Exception e) 
       { 
        logger.Error("List creation failed", e); 
        Console.WriteLine(e); 
       } 
      } 
     } 

La classe d'aide Web utilisé dans le récepteur de fonction:

public class WebHelper 
    { 
     #region Helper functions 
     public static SPWeb GetWeb(SPFeatureReceiverProperties prop) 
     { 
      using (SPSite site = prop.Feature.Parent as SPSite) 
      { 
       return site != null ? site.RootWeb : prop.Feature.Parent as SPWeb; 
      } 
     } 
     #endregion 
    } 

L'aide de la liste classe utilisée dans le récepteur:

public static SPList CreateList(string ListName, string description, string templateName, bool Visible, 
             SPWeb web) 
     { 
      SPListTemplate template = web.Site.RootWeb.ListTemplates[templateName]; 
      SPList list = web.Lists[web.Lists.Add(ListName, description, template)]; 
      list.EnableVersioning = false; 
      list.EnableAttachments = false; 
      list.OnQuickLaunch = false; 
      list.EnableFolderCreation = false; 
      list.Update(); 
      return list; 
     } 

Une chose à n ote est que ce mécanisme est probablement meilleur que via CAML parce que de cette façon nous n'avons pas besoin de maintenir des informations de champ dans le type de contenu et dans la liste CAML

J'ai trouvé à l'origine un article (see here) qui a fourni une grande partie de ma solution.

Questions connexes