我正在尝试使用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>
答案 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),它提供了我解决方案的重要部分。