2012-01-18 3 views
0

どこから開始するのかわかりません。新しいサイトを作成し、テンプレートサイトからルック、リスト、Webパーツをコピーするコード設定があります。SharePoint - テンプレートサイトから新しいサイトにWebパーツを複製する - XMLエラー

システム管理者としてログインしたときに罰金が科せられる!

foreach (Microsoft.SharePoint.WebPartPages.WebPart webPartTemplate in webPartCollectionTemplate) 
{ 
    try 
    { 
MemoryStream memoryStream = new MemoryStream(); 
XmlTextWriter xmlWriter = new XmlTextWriter(memoryStream, Encoding.UTF8); 
webPartManagerTemplate.ExportWebPart(webPartTemplate, xmlWriter); 
xmlWriter.Flush(); 
memoryStream.Flush(); 
memoryStream.Position = 0; 

XmlTextReader xmlReader = new XmlTextReader(memoryStream); 

Microsoft.SharePoint.WebPartPages.ListViewWebPart listViewWebPartTemplate = null; 
Microsoft.SharePoint.WebPartPages.ListViewWebPart listViewWebPartTarget = null; 
Microsoft.SharePoint.WebPartPages.WebPart webPartTarget = null; 

bool webPartIsListViewWebPart = false; 

// If it throws an exception, the web part is not a ListViewWebPart 
try 
{ 
    listViewWebPartTemplate = (ListViewWebPart)webPartTemplate; 
    webPartIsListViewWebPart = true; 
} 
catch { } 

if (webPartIsListViewWebPart) 
{ 
    string errorMessage = ""; 
    listViewWebPartTarget = (Microsoft.SharePoint.WebPartPages.ListViewWebPart)webPartManagerTarget.ImportWebPart(xmlReader, out errorMessage); 

    if (errorMessage != null) 
    // log it 

    // Drop the brackets from the Guid and create a Guid object from the string. Then use it to find the list so we can get the title. 
    SPList listTemplate = webTemplate.Lists[new Guid(listViewWebPartTemplate.ListName.ToString().TrimStart('{').TrimEnd('}'))]; 
    SPList listTarget = webTarget.Lists[listTemplate.Title]; 

    listViewWebPartTarget.ListName = listTarget.ID.ToString("B").ToUpper(); 
    listViewWebPartTarget.WebId = webTarget.ID; 
    listViewWebPartTarget.TitleUrl = webPartTemplate.TitleUrl.ToString().Replace(siteTemplate.ServerRelativeUrl, siteTarget.ServerRelativeUrl); 
    listViewWebPartTarget.Title = webPartTemplate.Title; 
    listViewWebPartTarget.ZoneID = webPartTemplate.ZoneID; 

    webPartDictTarget.Add(listViewWebPartTarget.ZoneID + webPartTemplate.ZoneIndex.ToString(), listViewWebPartTarget); 
} 
else 
{ 
    string errorMessage = ""; 
    webPartTarget = (Microsoft.SharePoint.WebPartPages.WebPart)webPartManagerTarget.ImportWebPart(xmlReader, out errorMessage); 

    if (errorMessage != null) 
    // log it 

    webPartTarget.ChromeType = webPartTemplate.ChromeType; 
    webPartTarget.TitleUrl = webPartTemplate.TitleUrl.ToString().Replace(siteTemplate.ServerRelativeUrl, siteTarget.ServerRelativeUrl); 
    webPartTarget.Title = webPartTemplate.Title; 
    webPartTarget.ZoneID = webPartTemplate.ZoneID; 

    webPartDictTarget.Add(webPartTarget.ZoneID + webPartTemplate.ZoneIndex.ToString(), webPartTarget); 
} 
    } 
    catch (Exception ex) 
    { 
    } 
} 

// Acquire keys and sort them. 
List<string> list = new List<string>(webPartDictTarget.Keys); 
list.Sort(); 

// Loop through keys. 
int i = 0; 
foreach (var key in list) 
{ 
    try 
    { 
    Microsoft.SharePoint.WebPartPages.WebPart wpTmp = (Microsoft.SharePoint.WebPartPages.WebPart)webPartDictTarget[key]; 
    webPartManagerTarget.AddWebPart(wpTmp, wpTmp.ZoneID, i); 
    } 
    catch (Exception ex) 
    { 
    } 
    i++; 
} 

誤差は次の行に投げられる:スタックトレースが{ "XMLドキュメントを生成中にエラーが発生しました"}以下

webPartManagerTarget.AddWebPart(wpTmp, wpTmp.ZoneID, i); 

XmlWriter xmlWriter、Object o、XmlSerializerNamespaces名前空間、文字列マイクロソフトの Microsoft.SharePoint.WebPartPages.WebPart.SerializeXml(XmlWriterを ライター、のXmlSerializer XMLS、ブールshouldSerializeAll)で System.Xml.Serialization.XmlSerializer.Serialize(XmlWriterをしたXmlWriter、 オブジェクトO)で3210 encodingStyleを、文字列ID) Microsoft.SharePointでMicrosoft.SharePoint.WebPartPages.BinaryWebPartSerializer.Serialize(PersonalizationScope 範囲)で Microsoft.SharePoint.WebPartPages.WebPart.WriteXmlGlobal(ブール disableSafeControlsCheck)で.SharePoint.WebPartPages.WebPart.WriteXmlAsBytes(XmlSerializerを XMLS) .WebPartPages.BinaryWebPartSerializer.get_Links() at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManagerでMicrosoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal(SPSupersetWebPart スーパーセット、ブールthrowIfLocked)で210 Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartToStore(Webパーツ Webパーツ、のInt32のviewId、ストリングviewGuid)。 admSitePanelSolution.admSiteCreateCollectionでMicrosoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart(Webパーツ Webパーツ、文字するzoneid、のInt32 zoneIndex)でAddWebPartInternal(Webパーツ Webパーツ、文字するzoneid、のInt32 zoneIndex、ブールthrowIfLocked)。 <> C_ DisplayClasse.b _c()

とのInnerException { "アクセスが拒否されました(HRESULTからの例外:0x80070005(E_ACCESSDENIED))。"}: Microsoft.SharePointで

Microsoft.SharePoint.Library.SPRequest.GetViewsSchemaXml(文字列 bstrUrl、文字列bstrListName、ブールbFullBlown、ISP2DSafeArrayWriter p2DWriter、のInt32で.SPGlobal.HandleUnauthorizedAccessException(UnauthorizedAccessException EX) Microsoft.SharePoint.SPListで Microsoft.SharePoint.SPList.get_Views()で Microsoft.SharePoint.SPViewCollection..ctor(SPListリスト)で Microsoft.SharePoint.SPViewCollection.EnsureViewSchemaでplDefaultViewIndex)(ブール fullBlownSchema)。 get_DefaultView()を に設定します。Microsoft.SharePoint.SPList.get_DefaultViewUrl()( )Microsoft.SharePoint.WebPartPages.ListViewWebPart。 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write10_WebPart(オブジェクトでShouldSerializeDetailLink() でMicrosoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write9_ListViewWebPart(文字列 N、ストリングNS、ListViewWebPart O、ブールISNULLABLE、ブールneedType) o)

システム管理者としてログインしていないと、何故このようなことが起こるのか、助けてもらえますか?この全体ブロックも昇格された権限内で実行され、SPSiteとSPWebも昇格ブロック内でインスタンス化されました。このコードは抜粋です。

UPDATE

私は、ユーザーベースのサイトコレクションのサイトコレクションの所有者にする場合は、上記のコードは正常に動作。したがって、上記のコードでは、コンテキストをリセットしたり、ベースサイトコレクションを参照する必要があります。ありがとうございました。

答えて

0

そして、私の同僚は一日を節約するために慌てています! SP devには、よく知られている「ハック」があり、アクセス権が奇妙で愚かなときに多く使われます。これは、HttpContextを無効にすることです。私はラインとループの周りにこれを試してみましたが、私には問題がありましたが、インポート中にコード内でそれをはるかに上げなければならないようです。

ここに新しい修正があります。

このコードは、Webパーツを1つのapsxページから別のページにコピーするために機能するようになりました。誰かを助けることを願っています。

関連する問題