Un esempio di come copiare una
Modern Page di
SharePoint Online su un'altra
site collection tramite il
Client-Script Object Model (CSOM)using System.Security;
using Microsoft.SharePoint.Client;
using OfficeDevPnP.Core.Pages;
private static void CopyPage()
{
string userName = "xxx@xxx.onmicrosoft.com";
string password = "???";
string webUrlSrc = "https://xxx.sharepoint.com";
string webUrlDest = "https://xxx.sharepoint.com/sites/HelpDesk2";
using (ClientContext ctxDest = GetContext(webUrlDest, userName, password))
{
using (ClientContext ctxSrc = GetContext(webUrlSrc , userName, password))
{
// leggo la pagina con la libreria PNP
ClientSidePage page = ctxSrc.Web.LoadClientSidePage("Home.aspx");
// uso CSOM per copiare la pagina
CopyPage(ctxDest, "HomeNew.aspx", page);
}
}
}
private static void CopyPage(ClientContext ctx, string newPageName, ClientSidePage page)
{
try
{
ListItem item = page.PageListItem;
// creo la nuova pagina
ClientSidePage newPage = ctx.Web.AddClientSidePage(newPageName, true);
if (page.PageHeader.ImageServerRelativeUrl != null)
{
newPage.PageHeader.ImageServerRelativeUrl = page.PageHeader.ImageServerRelativeUrl;
}
newPage.PageTitle = page.PageTitle;
newPage.LayoutType = page.LayoutType;
if (page.LayoutType == ClientSidePageLayoutType.Home)
{
newPage.RemovePageHeader();
}
if (!newPage.CommentsDisabled)
{
newPage.DisableComments();
}
if (!string.IsNullOrEmpty(Convert.ToString(item["PromotedState"])))
{
if (Convert.ToInt32(item["PromotedState"]) == 2)
{
newPage.PromoteAsNewsArticle();
}
}
newPage.Save();
ListItem newItem = newPage.PageListItem;
newItem["CanvasContent1"] = item["CanvasContent1"];
if (page.LayoutType != ClientSidePageLayoutType.Home)
{
newItem["PromotedState"] = item["PromotedState"];
}
newItem["PageLayoutType"] = item["PageLayoutType"];
newItem["ClientSideApplicationId"] = item["ClientSideApplicationId"];
newItem["LayoutWebpartsContent"] = item["LayoutWebpartsContent"];
newItem.Update();
ctx.ExecuteQuery();
newPage.Publish();
}
catch (Exception ex)
{
Console.WriteLine("Error Message: " + ex.Message);
throw ex;
}
}
private static ClientContext GetContext(string webUrl, string userName, string password)
{
SecureString securePassword = new SecureString();
foreach (char c in password.ToCharArray())
{
securePassword.AppendChar(c);
}
ClientContext ctx = new ClientContext(webUrl);
ctx.AuthenticationMode = ClientAuthenticationMode.Default;
ctx.Credentials = new SharePointOnlineCredentials(userName, securePassword);
return ctx;
}
static void Main(string[] args)
{
CopyPage();
}
Per il funzionamento richiede l'uso di questi pacchetti
Nuget:
Il metodo
LoadClientSidePage delle libreria
SharePointPnPCoreOnline ritorna i dati di una pagina.
Attualmente in PnP esiste un metodo
Save ma salva una copia
solo nella libreria corrente.
Il salvataggio in un altra libreria lo faccio usando
CSOM, creo una nuova pagina con un nome specifico, copio i campi della pagina, salvo le modifiche e pubblico.
In questo modo ottengo una copia di tutta la pagina con il relativo contenuto.
Ovviamente eventuali elementi che puntano ad altri contenuti, come link o liste, potrebbero non funzionare correttamente e andranno sistemati manualmente.