我手动在Sharepoint Web中的自定义内容类型中创建了一个自定义列(例如/ MySite / MyWeb)。我现在想要以编程方式将此内容类型复制到另一个Web(例如/ MySite / MyWeb2)。但是,在循环遍历代码中的自定义内容类型时,我只能找到2个字段:内容类型和标题(预期:标题和自定义列)。自定义列已丢失。我非常确定内容类型和字段是在网络级别添加的。
自定义内容类型继承自Item。
当我遍历网站的字段时,我可以看到自定义列,并将其复制到新网站。仅在自定义列未显示的内容类型中。
为什么会发生这种情况?
感谢。
答案 0 :(得分:2)
我花了四十多种方法才能最终成功地以编程方式将内容类型从一个Web复制到另一个Web。现在,在失败的方法中,只有其中一个会复制你的确切问题而不是完全燃烧,所以我假设这是你尝试的方法并分析它失败的原因。然后我会告诉你一个正常工作的方法。
您无法以编程方式将字段添加到仅在Web级别作用域的内容类型实例。试图这样做会产生以下明显错误:
此功能不适用于与列表无关的字段集合。
因此,如果您的方法基本上是在继承自Item的新Web中创建内容类型,然后只添加自定义列,则无法添加自定义列。我假设你试图复制内容类型,因为我尝试过的其他方法都失败了,或者工作并保留了该字段。
要使其工作,请创建一个范围为Web2 Web级别的新内容类型,但继承自Web1的原始内容类型。因此,使用我测试过的ALICE内容类型,你会得到类似的东西。
SPContentType ct2 = new SPContentType(Web1.ContentTypes["ALICE"], Web2.ContentTypes, "ALICE");
Web2.ContentTypes.Add(ct2);
Web2.Update();
这在第二个网站上创建了ALICE内容类型,其中包含原始ALICE内容类型所具有的自定义列。现在,由于原始ALICE内容类型不在Web2上,因此此ALICE实际上并不从该ALICE继承。它将继承自Item,您可以在UI中以编程方式确认它们。所以它成为一个成功的副本。
修改强>
这是我使用的确切代码,减去几行输出调试而不是说明我的实际Web2地址。它是从Web1上的工作流程运行的。我想分别实例化一个内容类型是主要的区别。如果这继续产生同样的错误,请告诉我。
SPWeb website = null; //Web1, which has ALICE already.
SPWeb web = null; //Web2, which does not yet have ALICE.
SPSite site = null;
try {
website = workflowProperties.Web;
site = new SPSite('webaddress of web2');
web = site.OpenWeb();
SPContentType ct = website.ContentTypes["ALICE"];
SPContentType act = new SPContentType(ct, web.ContentTypes, "ALICE");
act.Group = "Custom Content Types";
web.ContentTypes.Add(act);
web.Update();
}
finally { if (web != null) { web.Dispose(); } if (website != null) { website.Dispose(); } if (site != null) { site.Dispose(); } }