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也在提升区块内实例化。这段代码是摘录。
更新
如果我让用户成为基本网站集的网站集所有者,那么上面的代码运行良好。因此,上面代码中的内容重置上下文或需要引用基本网站集。非常感谢。
我的同事突然赶来拯救了这一天!在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页面复制到另一个。希望它能帮助到别人。