如何在企业Wiki网站的页面库中编程创建可编辑的Wiki页面



我是SharePoint的新手。我正在尝试在SharePoint 2010中的企业Wiki网站的页面库中编程创建一个Wiki页面。这是我的代码:

using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
        SPWeb rootWeb = site.RootWeb;
        rootWeb.AllowUnsafeUpdates = true;
        SPList wiki = rootWeb.Lists["Pages"];
        SPFolder rootFolder = wiki.RootFolder;
        SPFile wikiPage = rootFolder.Files.Add(String.Format("{0}/{1}", rootFolder.ServerRelativeUrl, "MyWikiPage.aspx"), SPTemplateFileType.WikiPage);
        SPListItem wikiItem = wikiPage.Item;
        wikiItem["PublishingPageContent"] = "my demo content";
        wikiItem.UpdateOverwriteVersion();
        rootWeb.AllowUnsafeUpdates = false;
}

该页面被创建,但问题是创建的页面不是可编辑的,并且没有插入演示内容。在编辑模式下打开时,没有内容空间可用,并且将编辑选项弄清楚。

我还尝试设置这样的默认内容:

 wikiitem [spbuiltinfieldid.wikifield] ="我的演示内容"; 

,但这给出了无效的字段错误。

我还尝试使用此代码行创建页面:

 spfile wikipage = sputility.createnewwikipage(wiki,string.format(" {0}/{1}",rootfolder.serverrelativeurl," mywikipage.aspx"); 
));

但结果完全相同。

我已经确认网站打开了" SharePoint Server Publishing"功能,并且为网站集合打开了" SharePoint Server Publishering Inferrantusture"功能。

请帮助。

在我的其他线程的帮助下

我们需要相应地创建一个新的发布页面并更新内容类型属性,而不是使用常规Wiki操纵例程来定位页面库。

为了使他人受益,这是对我有用的代码:

using (SPSite site = new SPSite(SPContext.Current.Web.Url))
{
    SPWeb rootWeb = site.RootWeb;
    rootWeb.AllowUnsafeUpdates = true;
    SPList wiki = rootWeb.Lists["Pages"];
    String url = wiki.RootFolder.ServerRelativeUrl.ToString();
    PublishingSite pubSite = new PublishingSite(rootWeb.Site);
    string pageLayoutName = "EnterpriseWiki.aspx"; //Page Layout Name
    string layoutURL = rootWeb.Url + "/_catalogs/masterpage/" + pageLayoutName;
    PageLayout layout = pubSite.PageLayouts[layoutURL];
    PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(rootWeb);
    PublishingPage newWikiPage;
    string myWikiPage = "MyWikiPage.aspx"; //Page name
    newWikiPage = publishingWeb.GetPublishingPages().Add(myWikiPage, layout);
    newWikiPage.Title = "My Wiki Page";
    newWikiPage.Update();
    rootWeb.AllowUnsafeUpdates = false;
}

如何使用SSOM

创建Wiki页面

c#

/// <summary>
/// Create Wiki Page
/// </summary>
/// <param name="wikiPages"></param>
/// <param name="pageName"></param>
/// <param name="pageContent"></param>
/// <returns></returns>
public static SPListItem CreateWikiPage(SPList wikiPages, string pageName, string pageContent)
{
   var web = wikiPages.ParentWeb;
   var pSite = new Microsoft.SharePoint.Publishing.PublishingSite(web.Site);
   var pageLayoutUrl = SPUtility.ConcatUrls(web.Site.Url,"/_catalogs/masterpage/EnterpriseWiki.aspx");
   var pageLayout = pSite.PageLayouts[pageLayoutUrl];
   var pWeb = Microsoft.SharePoint.Publishing.PublishingWeb.GetPublishingWeb(web);
   var wikiPage = pWeb.GetPublishingPages().Add(pageName, pageLayout);
   var wikiItem = wikiPage.ListItem;
   wikiItem["PublishingPageContent"] = pageContent;
   wikiItem.Update();
   return wikiItem;
}

PowerShell

if ((Get-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null)
{
    Add-PsSnapin Microsoft.SharePoint.PowerShell
}
Function Create-WikiPage([string]$WebUrl,[string]$PageName,[string]$PageContent)
{
    $web = Get-SPWeb $WebUrl
    $wikiPages = $web.Lists["Pages"]
    $pSite = New-Object Microsoft.SharePoint.Publishing.PublishingSite($web.Site) 
    $pageLayoutUrl = $web.Site.Url + "/_catalogs/masterpage/EnterpriseWiki.aspx"
    $pageLayout = $pSite.PageLayouts[$pageLayoutUrl]
    $pWeb = [Microsoft.SharePoint.Publishing.PublishingWeb]::GetPublishingWeb($web)
    $wikiPage = $pWeb.GetPublishingPages().Add($PageName, $pageLayout);
    $wikiPage.Title = [System.IO.Path]::GetFileNameWithoutExtension($PageName)
    $wikiItem = $wikiPage.ListItem
    $wikiItem["PublishingPageContent"] = $pageContent
    $wikiItem.Update()
}

用法

Create-WikiPage -WebUrl "http://contoso.intranet.sp.dev/faq/" -PageName "FAQ.aspx" -PageContent "Welcome to FAQ"

这个问题是旧的,但是我搜寻了如何在图形API中执行此操作的互联网,但我一无所获。我想在某个地方发布我的方法,以便下一个可怜的灵魂不必自己弄清楚。

如何在Graph API中创建SharePoint Wiki页面

这里的问题是Wiki页面是站点驱动器中的aspx文件,并且在"页面"中也是ListItems。列表。如果您只是尝试创建列表项目:

using Azure.Identity;
using Microsoft.Graph;
using System.Security.Cryptography.X509Certificates;
const string TENANT_ID = "<YourTenantId>";
const string APP_ID = "<YourAppId>";
const string CERTIFICATE_THUMBPRINT = "<YourCertificateThumbprint>";
const string SITE_URL = "<YourSiteUrl>";
//Get certificate
X509Store certStore = new(StoreName.My, StoreLocation.CurrentUser, OpenFlags.ReadOnly);
X509Certificate2 cert = certStore.Certificates.First(cert => cert.Thumbprint == CERTIFICATE_THUMBPRINT);
//Get a client using your certificate
ClientCertificateCredential certCredential = new(TENANT_ID, APP_ID, cert);
GraphServiceClient graphClient = new(certCredential);
//Get the site by the url and get the "Pages" list in that site
Uri docSiteUrl = new(SITE_URL);
Site site = await graphClient.Sites[$"{docSiteUrl.Host}:{docSiteUrl.AbsolutePath}"].Request().GetAsync();
var pagesLists = await graphClient.Sites[site.Id].Lists.Request().Filter($"(displayName eq 'Pages')").Top(2).GetAsync();
List pagesList = pagesLists.Single();
//Try to add a new list item
ListItem itemToAdd = new()
{
    Fields = new()
    {
        AdditionalData = new Dictionary<string, object>()
        {
            { "PublishingPageContent", "<p>Hello, World!</p>" },
            { "PublishingPageLayout", "/_catalogs/masterpage/EnterpriseWiki.aspx, Basic Page" }
        }
    }
};
var itemCreated = await graphClient.Sites[site.Id].Lists[pagesList.Id].Items.Request().AddAsync(itemToAdd);

然后您将收到以下错误:

microsoft.graph.serviceexception :文件和文件夹只能通过ONEDRIVE API

添加到DocumentLibrary

好吧,所以让我们继续在您要说的驱动器中创建项目:

//Create a drive item
var drives = await graphClient.Sites[site.Id].Drives.Request().GetAsync();
var pagesDrive = drives.Where(drv => drv.Name == "Pages").Single();
using var stream = new MemoryStream(Encoding.UTF8.GetBytes("<p>Hello, World!</p>"));
var driveItem = await graphClient.Sites[site.Id].Drives[pagesDrive.Id].Root.ItemWithPath("hello.aspx").Content.Request().PutAsync<DriveItem>(stream);

和嘿,Presto,它起作用了!或者,它跑了。然后,您转到SharePoint并尝试打开它,然后意识到它只是一个页面。这实际上不是Wiki页面。没问题,让我们继续更改页面布局:

//Update the list item
var listItem = await graphClient.Sites[site.Id].Drives[pagesDrive.Id].Items[driveItem.Id].ListItem.Request().GetAsync();
FieldValueSet fieldstoUpdate = new()
{
    AdditionalData = new Dictionary<string, object>()
    {
        { "PublishingPageContent", "<p>Hello, World!</p>" },
        { "PublishingPageLayout", "/_catalogs/masterpage/EnterpriseWiki.aspx, Basic Page" }
    }
};
var updatedFields = await graphClient.Sites[site.Id].Lists[pagesList.Id].Items[listItem.Id].Fields.Request().UpdateAsync(fieldstoUpdate);

,但不幸的是我们得到:

microsoft.graph.serviceexception :field'publishinghishingpagelayout'是只读的

那么我们上了众所周知的小溪吗?我们不能直接创建列表项目,我们不能在其存在之后编辑它,并且我们只能将文件名和内容上传到驱动器端点。

我们设置发布属性的唯一方法是,如果某种程度上,SharePoint将发布引擎的元数据放在文档内容本身内。让我们继续前进,手动创建一个空的Wiki页面,然后下载文件以查看是否有 - 哦,我的上帝!查看所有元数据!

<%@ Page Inherits="Microsoft.SharePoint.Publishing.TemplateRedirectionPage,Microsoft.SharePoint.Publishing,Version=16.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" %> <%@ Reference VirtualPath="~TemplatePageUrl" %> <%@ Reference VirtualPath="~masterurl/custom.master" %><%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<html xmlns:mso="urn:schemas-microsoft-com:office:office" xmlns:msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"><head>
<!--[if gte mso 9]><SharePoint:CTFieldRefs runat=server Prefix="mso:" FieldList="FileLeafRef,Comments,PublishingStartDate,PublishingExpirationDate,PublishingContactEmail,PublishingContactName,PublishingContactPicture,PublishingPageLayout,PublishingVariationGroupID,PublishingVariationRelationshipLinkFieldID,PublishingRollupImage,Audience,PublishingIsFurlPage,SeoBrowserTitle,SeoMetaDescription,SeoKeywords,RobotsNoIndex,PublishingPageContent,AverageRating,RatingCount,Ratings,e1a5b98cdd71426dacb6e478c7a5882f,TaxCatchAllLabel,LikesCount,Suggested_x0020_Reading"><xml>
<mso:CustomDocumentProperties>
<mso:PublishingContact msdt:dt="string">19</mso:PublishingContact>
<mso:PublishingIsFurlPage msdt:dt="string">0</mso:PublishingIsFurlPage>
<mso:display_urn_x003a_schemas-microsoft-com_x003a_office_x003a_office_x0023_PublishingContact msdt:dt="string">Kubat, Luke</mso:display_urn_x003a_schemas-microsoft-com_x003a_office_x003a_office_x0023_PublishingContact>
<mso:PublishingContactPicture msdt:dt="string"></mso:PublishingContactPicture>
<mso:RobotsNoIndex msdt:dt="string">0</mso:RobotsNoIndex>
<mso:PublishingContactName msdt:dt="string"></mso:PublishingContactName>
<mso:PublishingPageLayoutName msdt:dt="string">EnterpriseWiki.aspx</mso:PublishingPageLayoutName>
<mso:Comments msdt:dt="string"></mso:Comments>
<mso:PublishingContactEmail msdt:dt="string"></mso:PublishingContactEmail>
<mso:PublishingPageLayout msdt:dt="string">YOUR_SITE_HERE/_catalogs/masterpage/EnterpriseWiki.aspx, Basic Page</mso:PublishingPageLayout>
<mso:TaskStatus msdt:dt="string">Not Started</mso:TaskStatus>
<mso:PublishingPageContent msdt:dt="string">&lt;p&gt;​​&#x21;&lt;/p&gt;</mso:PublishingPageContent>
<mso:RequiresRouting msdt:dt="string">False</mso:RequiresRouting>
</mso:CustomDocumentProperties>
</xml></SharePoint:CTFieldRefs><![endif]-->
<title>Hello World</title></head>

现在,我无法假装能够告诉您所有这些领域的作用,我猜您不能使用我的。我在那里有一些领域,我确定您没有,反之亦然。但是,如果您手动创建一个简单的Wiki页面,将其下载为模板,用XML编码的页面内容替换MSO:publishingPageContent内容,然后像以前一样上传,就像我之前所做的那样,将为您提供有效的Wiki页面:

>
//Create a drive item
string pageContents = @"<%@ Page Inherits=""Microsoft.SharePoint.Publishing.TemplateRedirectionPage,Microsoft.SharePoint.Publishing,Version=16.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c"" %> <%@ Reference VirtualPath=""~TemplatePageUrl"" %> <%@ Reference VirtualPath=""~masterurl/custom.master"" %><%@ Register Tagprefix=""SharePoint"" Namespace=""Microsoft.SharePoint.WebControls"" Assembly=""Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"" %>
<html xmlns:mso=""urn:schemas-microsoft-com:office:office"" xmlns:msdt=""uuid:C2F41010-65B3-11d1-A29F-00AA00C14882""><head>
<!--[if gte mso 9]><SharePoint:CTFieldRefs runat=server Prefix=""mso:"" FieldList=""FileLeafRef,Comments,PublishingStartDate,PublishingExpirationDate,PublishingContactEmail,PublishingContactName,PublishingContactPicture,PublishingPageLayout,PublishingVariationGroupID,PublishingVariationRelationshipLinkFieldID,PublishingRollupImage,Audience,PublishingIsFurlPage,SeoBrowserTitle,SeoMetaDescription,SeoKeywords,RobotsNoIndex,PublishingPageContent,AverageRating,RatingCount,Ratings,e1a5b98cdd71426dacb6e478c7a5882f,TaxCatchAllLabel,LikesCount,Suggested_x0020_Reading""><xml>
<mso:CustomDocumentProperties>
<mso:PublishingContact msdt:dt=""string"">19</mso:PublishingContact>
<mso:PublishingIsFurlPage msdt:dt=""string"">0</mso:PublishingIsFurlPage>
<mso:display_urn_x003a_schemas-microsoft-com_x003a_office_x003a_office_x0023_PublishingContact msdt:dt=""string"">Kubat, Luke</mso:display_urn_x003a_schemas-microsoft-com_x003a_office_x003a_office_x0023_PublishingContact>
<mso:PublishingContactPicture msdt:dt=""string""></mso:PublishingContactPicture>
<mso:RobotsNoIndex msdt:dt=""string"">0</mso:RobotsNoIndex>
<mso:PublishingContactName msdt:dt=""string""></mso:PublishingContactName>
<mso:PublishingPageLayoutName msdt:dt=""string"">EnterpriseWiki.aspx</mso:PublishingPageLayoutName>
<mso:Comments msdt:dt=""string""></mso:Comments>
<mso:PublishingContactEmail msdt:dt=""string""></mso:PublishingContactEmail>
<mso:PublishingPageLayout msdt:dt=""string"">YOUR_SITE_HERE/_catalogs/masterpage/EnterpriseWiki.aspx, Basic Page</mso:PublishingPageLayout>
<mso:TaskStatus msdt:dt=""string"">Not Started</mso:TaskStatus>
<mso:PublishingPageContent msdt:dt=""string"">" + SecurityElement.Escape("<p>Hello, World!</p>") + @"</mso:PublishingPageContent>
<mso:RequiresRouting msdt:dt=""string"">False</mso:RequiresRouting>
</mso:CustomDocumentProperties>
</xml></SharePoint:CTFieldRefs><![endif]-->
<title>Hello World</title></head>";
var drives = await graphClient.Sites[site.Id].Drives.Request().GetAsync();
var pagesDrive = drives.Where(drv => drv.Name == "Pages").Single();
using var stream = new MemoryStream(Encoding.UTF8.GetBytes(pageContents));
var driveItem = await graphClient.Sites[site.Id].Drives[pagesDrive.Id].Root.ItemWithPath("hello.aspx").Content.Request().PutAsync<DriveItem>(stream);

再次,您不能在这里使用我的代码,您需要下载自己的代码。我正在使用SecurityElement.escape()来对我想要的Wiki页面内容进行XML编码。但是,如果您上传该文件应该可以工作。

甚至很酷的是,一旦您上传了一个有效的文件,就可以在列表项目上以编程方式更改内容,因为仅是读取的模板:

//Update the list item
var listItem = await graphClient.Sites[site.Id].Drives[pagesDrive.Id].Items[driveItem.Id].ListItem.Request().GetAsync();
FieldValueSet fieldstoUpdate = new()
{
    AdditionalData = new Dictionary<string, object>()
    {
        { "PublishingPageContent", "<p>Hello, World!</p>" }
    }
};
var updatedFields = await graphClient.Sites[site.Id].Lists[pagesList.Id].Items[listItem.Id].Fields.Request().UpdateAsync(fieldstoUpdate);

这比每次要编辑时都要重新上传整个模板要容易得多。

最新更新