public static void SetPersonalizationFromXml(HttpContext context, Page pageNode, XmlDocument xml, out string errorMessage)
{
string error = String.Empty;
string virtualPath = CreateVirtualPath(pageNode.Path);
PageBase page = InstantiatePage(context, virtualPath, pageNode);
page.PreLoad += delegate
{
WebPartManager wpm = WebPartManager.GetCurrentWebPartManager(page);
WebPartZoneCollection webPartZones = wpm.Zones;
foreach (WebPartZone zone in webPartZones)
{
foreach (WebPart part in zone.WebParts)
{
if (!part.IsStatic)
wpm.DeleteWebPart(part);
}
XmlNode zoneDescriptionNode = xml.SelectNodes(@"//*[@id='" + zone.ID + "']")[0];
XmlElement zoneDescription = zoneDescriptionNode as XmlElement;
if (zoneDescription != null)
{
foreach (XmlElement webPartDescription in zoneDescription.GetElementsByTagName("webPart"))
{
string webPartXml = String.Empty;
using (StringWriter sw = new StringWriter())
{
using (XmlWriter writer = new XmlTextWriter(sw))
{
writer.WriteStartElement("webParts");
webPartDescription.WriteTo(writer);
writer.WriteEndElement();
writer.Flush();
}
webPartXml = sw.ToString();
}
using (StringReader sr = new StringReader(webPartXml))
{
using (XmlReader reader = new XmlTextReader(sr))
{
WebPart part = wpm.ImportWebPart(reader, out error);
wpm.AddWebPart(part, zone, zone.WebParts.Count);
}
}
}
}
}
};
//TODO: Clever exception handling
ExecutePage(context, virtualPath, page, pageNode, true);
errorMessage = error;
}