我接到了将内容从另一个 CMS 系统迁移到 SharePoint 2010 的任务。
旧系统中的数据相当容易捕获,页面层次结构也很简单,所以我并不担心这一点。
但是,我对如何在代码中创建页面感到完全困惑。我正在使用 Microsoft.SharePoint.Client
命名空间,因为我的系统上没有安装 sharepoint,并且希望将其编码为控制台应用程序,所以我正在使用我正在使用 ClientContext
。 (另一方面,如果有必要,我愿意考虑其他解决方案)。
我的最终游戏:将页面上传到某个使用母版页的文件夹层次结构中,在标题 Web 部件中包含页面标题,以及一个大型的内容可编辑 Web 部件正文中,以便任何用户都可以参与并编辑内容。
到目前为止我尝试过的事情:
- 使用 FileCollection.Add() 将 aspx 文件添加到文件夹“Site Pages”。这会在浏览器中呈现 html,但不会启用用户编辑页面的任何功能
- 使用 ListItemCollection.Add() 向网站添加页面,但我不知道需要哪些字段。我还记得它出现了一个运行时错误,说我应该使用 FileCollection.Add()
- 上传到“网站页面”而不是“页面”
- 还有很多其他人...我的头:(
我在网上看到的唯一合理的事情是使用 PublishingPage
类型和 PublishingWeb
。但是,PublishingWeb 只能从 SPWeb 对象构建,这要求我在我的工作站上实际托管共享点应用程序。
如果有人可以伸出援手,我们将不胜感激:)
最佳答案
这是我用来创建页面的方法。这似乎是一种比阿基诺先生的方式更受支持的创建页面的方式。虽然这是针对 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();
}
}
关于c# - 如何以编程方式将文章页面添加到共享点站点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2287850/