2012-01-18 4 views
0

어디에서 시작해야할지 잘 모르겠습니다. 새로운 사이트를 만들고 템플릿 사이트에서 모양, 목록 및 웹 파트를 복사하는 코드 설정이 있습니다.SharePoint - 템플릿 사이트에서 새 사이트로 웹 파트 복제 - 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++; 
} 

오류는 다음 줄에 발생합니다 :

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

스택 추적은 다음 { "XML 문서를 생성하는 동안 오류가 발생했습니다."} :

XmlWriter xmlWriter, Object o, XmlSerializerNamespaces 네임 스페이스, 문자열 마이크로 소프트 Microsoft.SharePoint.WebPartPages.WebPart.SerializeXml (XmlWriter를 작가, XmlSerializer가의 XMLS, 부울 shouldSerializeAll)에서 System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter를 XmlWriter를, 개체 O)에서3210 인코딩 스타일, 문자열 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.SPWebPartManager.AddWebPartToStore Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager에서 Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal에서 (는 WebPart 는 WebPart, INT32는 viewId 문자열 viewGuid) (SPSupersetWebPart 수퍼 부울 throwIfLocked). admSitePanelSolution.admSiteCreateCollection에서 AddWebPartInternal (는 WebPart 는 WebPart, 문자열 zoneId, INT32 zoneIndex, 부울 throwIfLocked) Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart에서 (는 WebPart 는 WebPart, 문자열 zoneId, INT32 zoneIndex). <> C_ DisplayClasse.b _C()

그리고의 InnerException { "액세스가 거부되었습니다 (HRESULT에서 예외 : 0x80070005입니다 (E_ACCESSDENIED))."} : Microsoft.SharePoint에서

.SPGlobal.HandleUnauthorizedAccessException Microsoft.SharePoint.Library.SPRequest.GetViewsSchemaXml에서 (UnauthorizedAccessException 예) (문자열 bstrUrl, 문자열 bstrListName, 부울 bFullBlown, ISP2DSafeArrayWriter p2DWriter, INT32 Microsoft.SharePoint.SPList에서 Microsoft.SharePoint.SPList.get_Views()에서 Microsoft.SharePoint.SPViewCollection..ctor (SPList 목록)에서 Microsoft.SharePoint.SPViewCollection.EnsureViewSchema에서 88,plDefaultViewIndex) (부울 fullBlownSchema). get_DefaultView() 에서 Microsoft.SharePoint.SPList.get_DefaultViewUrl() 에서 Microsoft.SharePoint.WebPartPages.ListViewWebPart. Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write10_WebPart에서 Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write9_ListViewWebPart (문자열 N 문자열 NS, ListViewWebPart 오 부울 ISNULLABLE 부울 needType) 에서 ShouldSerializeDetailLink() (개체 o)

누구든지 시스템 관리자로 로그인하지 않은 경우 사용자에게 도움을 줄 수 있습니까? 이 전체 블록은 상승 된 권한 내에서 실행되며 SPSite 및 SPWeb도 상승 된 블록 내부에서 인스턴스화됩니다. 이 코드는 발췌 부분입니다. 나는 사용자 기본 사이트 모음의 사이트 모음 소유자 할 경우

UPDATE

는 다음 위의 코드는 잘 실행됩니다. 따라서 위의 코드에서 컨텍스트를 다시 설정하거나 기본 사이트 모음을 참조해야합니다. 고맙습니다.

답변

0

그리고 동료가 하루를 절약하기 위해 활발하게 움직입니다! SP dev에는 퍼미션이 이상하고 어리석은 경우에 많이 사용되는 잘 알려진 '해킹'이 있습니다. HttpContext를 무효화하는 것입니다. 나는이 문제를 줄 줄과 루프 주위에 이것을 시도했지만 가져 오기 중에 코드에서 훨씬 더 높은 위치에 놓아야하는 것처럼 보입니다.

다음은 새로운 수정입니다.

이 코드는 이제 하나의 apsx 페이지에서 다른 웹 페이지로 웹 파트를 복사하는 데 적합합니다. 누군가가 도움이되기를 바랍니다.

관련 문제