我已经完成了从其他CMS系统到SharePoint 2010的内容迁移任务。
旧系统中的数据相当容易捕获,页面层次结构很简单,所以我并不担心。
但是,我完全 flummoxed 关于如何在代码中创建页面。我正在使用Microsoft.SharePoint.Client
命名空间,因为我的系统上没有安装sharepoint,并且我希望将其编写为控制台应用程序,因此我正在使用ClientContext
。 (另一方面,如果有必要,我愿意进入其他解决方案)。
我的最终游戏:要将页面上传到使用母版页的某个文件夹层次结构中,页面标题包含在标题Web部件中,以及大型内容可编辑的Web部件在正文中,所以任何用户都可以出现并编辑内容。
到目前为止我尝试过的事情:
我在网上看到的唯一可信的事情就是使用PublishingPage
类型和PublishingWeb
。但是,PublishingWeb只能从SPWeb对象构建,这需要我在我的工作站上实际托管sharepoint应用程序。
如果有人可以伸出援助之手,那将非常感激:)
答案 0 :(得分:2)
这是我用来创建页面的方法。这似乎是比阿基诺先生更受支持的创建页面的方式。虽然这是针对MOSS 2007的,但我确信2010年还存在等效项。此外,我建议使用完整的对象模型创建控制台应用程序。您必须在服务器本身上运行它,但这对迁移来说似乎不是什么大问题?这样你就不会受到任何限制。
public static void CreatePage(string url, string pageName, string title, string layoutName, Dictionary<string, string> fieldDataCollection)
{
var relUrl = new Uri(url);
using (SPSite site = new SPSite(url))
using (SPWeb web = site.AllWebs[relUrl.AbsolutePath])
{
if (!PublishingWeb.IsPublishingWeb(web))
throw new ArgumentException("The specified web is not a publishing web.");
PublishingWeb pubweb = PublishingWeb.GetPublishingWeb(web);
PageLayout layout = null;
string availableLayouts = string.Empty;
foreach (PageLayout lo in pubweb.GetAvailablePageLayouts())
{
availableLayouts += "\t" + lo.Name + "\r\n";
if (lo.Name.ToLowerInvariant() == layoutName.ToLowerInvariant())
{ layout = lo; break; }
}
if (layout == null)
throw new ArgumentException("The layout specified could not be found. Available layouts are:\r\n" + availableLayouts);
if (!pageName.ToLowerInvariant().EndsWith(".aspx")) pageName += ".aspx";
PublishingPage page = pubweb.GetPublishingPages().Add(pageName, layout);
page.Title = title;
SPListItem item = page.ListItem;
foreach (string fieldName in fieldDataCollection.Keys)
{
string fieldData = fieldDataCollection[fieldName];
try
{
SPField field = item.Fields.GetFieldByInternalName(fieldName);
if (field.ReadOnlyField)
{
Console.WriteLine("Field '{0}' is read only and will not be updated.", field.InternalName);
continue;
}
if (field.Type == SPFieldType.Computed)
{
Console.WriteLine("Field '{0}' is a computed column and will not be updated.", field.InternalName);
continue;
}
if (field.Type == SPFieldType.URL)
{
item[field.Id] = new SPFieldUrlValue(fieldData);
}
else if (field.Type == SPFieldType.User)
{
// AddListItem.SetUserField(web, item, field, fieldData);
}
else
{
item[field.Id] = fieldData;
}
}
catch (ArgumentException)
{
Console.WriteLine("WARNING: Could not set field {0} for item {1}.", fieldName, item.ID);
}
}
page.Update();
}
}
答案 1 :(得分:1)
我没有看到在没有实际发布方法的情况下创建发布页面的方法。
当您创建新的文章页面时,它只会在页面内创建一些xml参数,布局本身位于/_catalogs/masterpage/article-XXXX.aspx文件中。
您可以尝试下载在Pages文档库中创建的本机文件,了解其结构,使用您的数据填充XML,然后使用FileCollection将其上传回Pages文档库 - 这是我唯一的猜测。
编辑:示例文章页
<%@ Page Inherits="Microsoft.SharePoint.Publishing.TemplateRedirectionPage,Microsoft.SharePoint.Publishing,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" %>
<%@ Reference VirtualPath="~TemplatePageUrl" %>
<%@ Reference VirtualPath="~masterurl/custom.master" %>
<html xmlns:mso="urn:schemas-microsoft-com:office:office" xmlns:msdt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"><head>
<!--[if gte mso 9]><xml>
<mso:CustomDocumentProperties>
<mso:PublishingContact msdt:dt="string">1073741823</mso:PublishingContact>
<mso:display_urn_x003a_schemas-microsoft-com_x003a_office_x003a_office_x0023_PublishingContact msdt:dt="string">System Account</mso:display_urn_x003a_schemas-microsoft-com_x003a_office_x003a_office_x0023_PublishingContact>
<mso:PublishingContactPicture msdt:dt="string"></mso:PublishingContactPicture>
<mso:PublishingContactName msdt:dt="string"></mso:PublishingContactName>
<mso:ContentTypeId msdt:dt="string">0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF390078FB5FE740F6714B9595501175ECD8F000727044016EAB3B45B9E104498E366C85</mso:ContentTypeId>
<mso:Comments msdt:dt="string"></mso:Comments>
<mso:PublishingContactEmail msdt:dt="string"></mso:PublishingContactEmail>
<mso:PublishingPageLayout msdt:dt="string">http://dmserver008/_catalogs/masterpage/ArticlePage.aspx, EstudoAndre</mso:PublishingPageLayout>
</mso:CustomDocumentProperties>
</xml><![endif]--><title>New Article</title></head>
要抓一个,点击Pages库=&gt;内容菜单=&gt;发送至=&gt;下载副本
答案 2 :(得分:1)
只要您在项目和文档本身上获得正确的设置,就可以上传页面文件。上传文件后,您可以适当地设置内容类型和属性。如果您先手动创建页面,则应该能够获得具有所有正确设置的对象。
但是,我强烈建议设置开发一个将在sharepoint服务器上运行的控制台应用程序,而不是依赖于Web服务。服务器端apis(包括PublishingPage)往往更容易使用。