Un esempio di come copiare una Modern Page di SharePoint Online su un'altra site collection tramite il Client-Script Object Model (CSOM)

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();
}
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.
Tags:
C#235 CSOM9 SharePoint497 SharePoint Online75
Potrebbe interessarti anche: