如何以编程方式将文章页面添加到sharepoint站点?

时间:2010-02-18 10:30:09

标签: c# sharepoint visual-studio-2010 migration

我已经完成了从其他CMS系统到SharePoint 2010的内容迁移任务。

旧系统中的数据相当容易捕获,页面层次结构很简单,所以我并不担心。

但是,我完全 flummoxed 关于如何在代码中创建页面。我正在使用Microsoft.SharePoint.Client命名空间,因为我的系统上没有安装sharepoint,并且我希望将其编写为控制台应用程序,因此我正在使用ClientContext。 (另一方面,如果有必要,我愿意进入其他解决方案)。

我的最终游戏:要将页面上传到使用母版页的某个文件夹层次结构中,页面标题包含在标题Web部件中,以及大型内容可编辑的Web部件在正文中,所以任何用户都可以出现并编辑内容。

到目前为止我尝试过的事情

  • 使用FileCollection.Add()将aspx文件添加到“站点页面”文件夹中。这会在浏览器中呈现html,但不会为用户启用任何功能来编辑页面
  • 使用ListItemCollection.Add()向网站添加页面,但我不知道我需要哪些字段。另外我记得它提出了一个运行时错误,说我应该使用FileCollection.Add()
  • 上传到“网页”而不是“网页”
  • 这么多人......我的头脑:(

我在网上看到的唯一可信的事情就是使用PublishingPage类型和PublishingWeb。但是,PublishingWeb只能从SPWeb对象构建,这需要我在我的工作站上实际托管sharepoint应用程序。

如果有人可以伸出援助之手,那将非常感激:)

3 个答案:

答案 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>
&nbsp;<!--[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)往往更容易使用。