我花了超過四分之一的方法最終能夠成功並以編程方式將內容類型從一個網絡複製到另一個網絡。現在,在失敗的方法中,只有其中一個會複製你確切的問題,而不能完全燃燒,所以我會假設這是你嘗試的方法並分析失敗的原因。然後我會告訴你一個正常工作的方法。
您無法以編程方式將字段添加到僅限於Web級別的內容類型實例。嘗試這樣做具有以下明顯的錯誤:
This functionality is unavailable for field collections not associated with a list.
所以,如果你的方法是從根本上建立新的網絡,從項目繼承,然後只需添加自定義列的內容類型,它會失敗添加自定義列。我假設你試圖複製內容類型,因爲我試過的其他方法都失敗了,或者工作並保留了該字段。
要使其工作,請創建一個新的內容類型,該類型的作用域爲Web2的Web級別,但是繼承自Web1的原始內容類型。所以,使用我測試過的ALICE內容類型,你會有這樣的東西。
SPContentType ct2 = new SPContentType(Web1.ContentTypes["ALICE"], Web2.ContentTypes, "ALICE");
Web2.ContentTypes.Add(ct2);
Web2.Update();
這在第二個Web上創建了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(); } }
我在web1中創建的自定義列會發生什麼?它會在web2中的適當web級別創建嗎?我所做的是先將web1中的任何自定義字段複製到web2,然後在web2中創建一個繼承Item的新內容類型,然後遍歷web1內容類型的字段並將任何額外字段複製到新內容類型。起初,它沒有工作,當我只是添加字段,但使用contentType.FieldLinks.Add(新的SPFieldLink(字段))它似乎工作。我也會試一試。謝謝。 – BeraCim 2010-05-02 23:24:56
好的嘗試了你的方法...「內容類型不能添加到其範圍之外」例外。 – BeraCim 2010-05-03 06:26:51
@BeraCim好吧,你原來的方法就是我所期望的,正是我所引用的錯誤。我有點驚訝,你得到了這個錯誤,因爲我在其他一些測試中收到了這個錯誤,但沒有收到我寫的版本。我會做一些額外的測試。不過,我很高興你找到了一種可行的方法。 – 2010-05-03 12:18:25