Sharepoint 自定义内容类型中未显示自定义字段

Sharepoint 自定义内容类型中未显示自定义字段,sharepoint,sharepoint-2007,content-type,Sharepoint,Sharepoint 2007,Content Type,我在Sharepoint网站的自定义内容类型中手动创建了一个自定义列(例如/MySite/MyWeb)。我现在想通过编程将此内容类型复制到另一个web(例如/MySite/MyWeb2)。然而,在代码中循环使用自定义内容类型时,我只能找到两个字段:内容类型和标题(预期为:标题和自定义列)。缺少自定义列。我非常确定内容类型和字段是在web级别添加的 自定义内容类型是从项继承的 当我循环浏览web的字段时,我可以看到自定义列,该列已复制到新web。只有在内容类型中,自定义列才不会显示 知道为什么会这

我在Sharepoint网站的自定义内容类型中手动创建了一个自定义列(例如/MySite/MyWeb)。我现在想通过编程将此内容类型复制到另一个web(例如/MySite/MyWeb2)。然而,在代码中循环使用自定义内容类型时,我只能找到两个字段:内容类型和标题(预期为:标题和自定义列)。缺少自定义列。我非常确定内容类型和字段是在web级别添加的

自定义内容类型是从项继承的

当我循环浏览web的字段时,我可以看到自定义列,该列已复制到新web。只有在内容类型中,自定义列才不会显示

知道为什么会这样吗


谢谢。

我花了四分之一打以上的方法才最终能够以编程方式成功地将内容类型从一个web复制到另一个web。现在,在失败的方法中,只有一种方法会复制您的确切问题,并且不会完全燃烧,所以我假设这就是您尝试的方法,并分析它失败的原因。然后我将向您展示一种正常工作的方法

不能以编程方式将字段添加到仅在web级别确定作用域的内容类型实例。尝试执行此操作会出现以下明显错误:

此功能对于未与列表关联的字段集合不可用

因此,如果您的方法基本上是在新web中创建一个从Item继承的内容类型,然后只添加自定义列,那么它将无法添加自定义列。我假设这就是您试图复制内容类型的方式,因为我尝试的其他方法要么失败,要么工作并保留该字段

要使其正常工作,请创建一个新的内容类型,该类型的范围为Web2的web级别,但继承自Web1的原始内容类型。因此,使用我测试的ALICE内容类型,您将得到类似的结果

SPContentType ct2 = new SPContentType(Web1.ContentTypes["ALICE"], Web2.ContentTypes, "ALICE");
Web2.ContentTypes.Add(ct2);
Web2.Update();
这在第二个web上创建了ALICE内容类型,该web具有原始ALICE内容类型所具有的自定义列。现在,由于最初的ALICE内容类型不在Web2上,那么这个ALICE实际上并不是从那个ALICE继承的。它将从项继承,您可以在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(); } }

我在web1中创建的自定义列将发生什么变化?它是否也会在web2的适当web级别创建?我所做的是首先将任何自定义字段从web1复制到web2,然后在web2中创建一个继承项的新内容类型,然后循环遍历web1内容类型的字段,并将任何额外字段复制到新内容类型。起初,当我只是添加字段时,它不起作用,但使用contentType.FieldLinks.add(newspfieldlink(field))它似乎起作用了。我也会试试你的方法。谢谢。好的,试试你的方法。。。得到“内容类型不能添加到其范围之外”异常。@BeraCim好的,您的原始方法是我所期望的,并且正是导致我引用的错误的原因。我有点惊讶你会出现这个错误,因为我在其他一些测试中收到了这个错误,但不是我编写的版本。我会做一些额外的测试。不过,我很高兴你找到了一个有效的方法。@BeraCim好的,我编辑了我的答案,以准确反映我使用的有效代码。这是在工作流内部完成的,因此它具有最大权限。没有必要设置web.AllowUnsafeUpdates。让我知道这是否更成功。对于那些后来偶然发现这个答案的人。。。虽然此代码在技术上可行,但经过进一步研究后,更推荐使用FieldLink,如中所述