Не уверен, с чего начать.У меня есть настройки кода для создания нового сайта, а затем скопировать внешний вид, списки и веб-части с сайта шаблона.
ЭТО РАБОТАЕТ ХОРОШО, КОГДА ВХОДИЛ В СИСТЕМУ АДМИНИСТРАЦИИ!
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 (пространства имен XmlWriter xmlWriter, Object o, XmlSerializerNamespaces, String encodingStyle, String) в System.Xml.Serialization.XmlSerializer.Serialize (XmlWriter xml)Microsoft.SharePoint.WebPartPages.WebPart.SerializeXml (писатель XmlWriter, XmlSerializer xmls, логическое mustSerializeAll) в Microsoft.SharePoint.WebPartPages.WebPart.WriteXmlAsBytes (XmlSerializer xmls)SharePoint.WebPartPages.BinaryWebPartSerializer.Serialize (область действия PersonalizationScope) at Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.get_Links () в Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartToStore (WebPart webPart, Int32 viewId, строковый viewGuid) в Microsoft.SharePoint.WebPartPartНеобязательный DisplayClasse.b _c ()
И InnerException {"Доступ запрещен.(Исключение из HRESULT: 0x80070005 (E_ACCESSDENIED)) "}:
в Microsoft.SharePoint.SPGlobal.HandleUnauthorizedAccessException (исключение UnauthorizedAccessException) в Microsoft.SharePoint.Library.SPRequest.NestStringBringStation, Boolean bFullBlown, ISP2DSafeArrayWriter p2DWriter, Int32 & plDefaultViewIndex) в Microsoft.SharePoint.SPViewCollection.EnsureViewSchema (логическое fullBlownSchema) в Microsoft.SharePoint.SPViewCollection..SP.SharePoint.SP (список SPListPoint) в Microsoft.SharePoint.SPViewCollection..SP (список SPListPoint) в Microsoft (S)SPList.get_DefaultView () в Microsoft.SharePoint.SPList.get_DefaultViewUrl () в Microsoft.SharePoint.WebPartPages.ListViewWebPart.ShouldSerializeDetailLink () в Microsoft.Xml.Serialization.isNullable, Boolean needType) в Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterListViewWebPart.Write10_WebPart (Object o)
Может ли кто-нибудь помочь понять, почему это происходит, когда вы не вошли в систему как системный администратор.Весь этот блок также работает с повышенными привилегиями, а SPSite и SPWeb также были созданы внутри повышенного блока.Этот код является выдержкой.
ОБНОВЛЕНИЕ
Если я сделаю пользователя владельцем семейства сайтов базового семейства сайтов, то приведенный выше кодработает нормально.Так что в приведенном выше коде сбрасывает контекст или должен ссылаться на базовое семейство сайтов.Спасибо.