Sharepoint ListTemplate多种内容类型 - 参考字段

时间:2009-10-17 12:44:54

标签: c# xml sharepoint wss caml

我正在尝试使用CAML在SharePoint功能中创建列表模板。我有两种内容类型 “新闻”和“新闻稿”他们共享两个名为概述和<的字段强>描述

我一直在读“listtemplate”caml元素不会自动添加内容类型中的字段,您需要指定所有字段。指定字段时,SharePoint不会更新共享点列表设置(screenshot)中的“已使用”。 这是一个问题,因为无法使用这些字段更新视图。

这可以通过用c#编写的功能接收器修复吗?

有什么想法吗?

<?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>

1 个答案:

答案 0 :(得分:1)

这是CAML为您做初始化的问题之一,如果可能的话,我总是在代码中做事:)

前几天我遇到了类似的问题,最后从列表中删除了ContentTypeRef部分,让它继承了item和在功能接收器中创建列表,添加了我想要的内容类型,然后删除了项目内容类型。这样,列表就可以使用内容类型

中的字段正确填充

以下是我的功能接收器:

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);
                }
            }
        }

功能接收器中使用的Web助手类:

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  
    }

功能接收器中使用的列表助手类:

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;
        }

有一点需要注意的是,这种机制可能比通过CAML更好,因为这样我们就不必在内容类型和列表CAML中维护字段信息

我最初发现了一篇文章(see here),它提供了我解决方案的重要部分。