0

CAML を使用して SharePoint 機能でリスト テンプレートを作成しようとしています。「News」と「News Release」の 2 つのコンテンツ タイプ があり、どちらもOverviewDescriptionという 2 つのフィールドを共有しています。

「listtemplate」caml 要素はコンテンツ タイプからフィールドを自動的に追加しないことを読んでいます。すべてのフィールドを指定する必要があります。フィールドが指定されている場合、SharePoint は SharePoint リスト設定の「使用先」を更新しません (スクリーンショット)。ビューはこれらのフィールドで更新できないため、これは問題です。

これは、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>
4

1 に答える 1

1

これは、CAMLに初期化を行わせる際の問題の1つです。可能な場合は、常にコードで処理を行います:)

先日同様の問題が発生し、ContentTypeRefセクションをリストから削除して、アイテムから継承させ、機能レシーバーでリストを作成し、必要なコンテンツタイプを追加してから、アイテムのコンテンツタイプを削除しました。これにより、リストにコンテンツタイプのフィールドが正しく入力されます

以下は私の機能レシーバーです:

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

注意すべき点の1つは、このメカニズムはCAMLを介するよりもおそらく優れているということです。これは、この方法では、コンテンツタイプとリストCAMLの両方でフィールド情報を維持する必要がないためです。

私はもともと、私のソリューションの大部分を提供する記事(ここを参照)を見つけました。

于 2009-10-17T14:01:59.050 に答える