SharePoint-将web部件从模板网站克隆到新网站-XML错误

本文关键字:网站 新网站 错误 -XML web SharePoint- | 更新日期: 2023-09-27 18:20:33

不知道从哪里开始。我有代码设置来创建一个新网站,然后从模板网站复制外观、列表和Web部件。

以系统管理员身份登录时工作正常

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文档时出错。"}:

位于System.Xml.Serialization.XmlSerializer.Serialize(XmlWriterxmlWriter,对象o,XmlSerializerNamespaces命名空间,字符串encodingStyle,字符串id)System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter XmlWriter,对象o)位于Microsoft.SharePoint.WebPartPages.WebPart.SerializeXml(XmlWriterwriter、XmlSerializer xmls、Boolean shouldSerializeAll)Microsoft.SharePoint.WebPartPages.WebPart.WriteXmlAsBytes(XmlSerializerxmls)Microsoft.SharePoint.WebPartPages.WebPart.WriteXmlGlobal(布尔值disableSafeControlsCheck)Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.Serialize(PersonalizationScope范围)Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.get_Links()在Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartToStore(WebPartwebPart、Int32 viewId、String viewGuid)Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal(SPSupersetWebPart超集,布尔throwIfLocked)Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPartInternal(WebPartwebPart、String zoneId、Int32 zoneIndex、布尔throwIfLocked)Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart(WebPartwebPart,String zoneId,Int32 zoneIndex)admSitePanelSolution.admSiteCreateCollection。<>c_DisplayClasse.b_c()

并且InnerException{"访问被拒绝。(HRESULT:0x80070005(E_ACCESSDENIED)中的异常)"}:

在Microsoft.SharePoint.SPGlobal.HHandleUnauthorizedAccessException(未授权访问异常ex)Microsoft.SharePoint.Library.SPRequest.GetViewsSchemaXml(字符串bstrUrl,字符串bstrListName,布尔值bFullBlown,ISP2DSafeArrayWriterp2D编写器,Int32&plDefaultViewIndex)Microsoft.SharePoint.SViewCollection.EnsureViewSchema(布尔值fullBlownSchema)位于的Microsoft.SharePoint.SViewCollection.ctor(SPList列表)位于的Microsoft.SharePoint.SPList.get_Views()位于的Microsoft.SharePoint.SPList.get_DefaultView()位于的Microsoft.SharePoint.SPList.get_DefaultViewUrl()Microsoft.SharePoint.WebPartPages.ListViewWebPart.HShouldSerializeDetailLink()在Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write9_ListViewWebPart(字符串n、 字符串ns,ListViewWebPart o,布尔值isNullable,布尔值needType)在Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write10_WebPart(对象o)

有人能提供一些帮助,说明为什么在没有以系统管理员身份登录时会发生这种情况吗。整个区块也在提升的权限内运行,SPSite和SPWeb也在提升区块内实例化。这段代码是摘录。

更新

如果我让用户成为基本网站集的网站集所有者,那么上面的代码运行良好。因此,上面代码中的内容重置上下文或需要引用基本网站集。非常感谢。

SharePoint-将web部件从模板网站克隆到新网站-XML错误

我的同事突然赶来拯救了这一天!在SP dev中,有一个众所周知的"破解",当权限变得奇怪和愚蠢时,会经常使用它。这是为了使HttpContext无效。我在行和循环中尝试了这个方法,这给了我一个问题,但在导入过程中,似乎必须将它放在代码中更高的位置。

这是新的解决方案。

HttpContext currentContext = HttpContext.Current;
HttpContext.Current = null;
listViewWebPartTarget = (Microsoft.SharePoint.WebPartPages.ListViewWebPart)webPartManagerTarget.ImportWebPart(xmlReader, out errorMessage);
HttpContext.Current = currentContext;

此代码现在可用于将Web部件从一个apsx页面复制到另一个。希望它能帮助到别人。