Copiare una Modern Page su un'altra site collection con SharePoint CSOM
Un esempio di come copiare una Modern Page di SharePoint Online su un'altra site collection tramite il Client-Script Object Model (CSOM)
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.
C#
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();
}
- Microsoft.SharePointOnline.CSOM (dotnet add package Microsoft.SharePointOnline.CSOM --version 16.1.19927.12000)
- SharePointPnPCoreOnline (dotnet add package SharePointPnPCoreOnline --version 3.20.2004)
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.