c# - 如何以编程方式将文章页面添加到共享点站点?

标签 c# sharepoint visual-studio-2010 migration

我接到了将内容从另一个 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/

相关文章:

c++ - 简单的计算器程序有什么问题?

c# - 找不到类型或命名空间名称 'HttpResponseMessage'

c# - 适用于 Surface Pro 3 Windows 8.1 的蓝牙 API

c# - PropertyDescriptor 和 WPF 绑定(bind)机制

c# - 参数化查询被截断,参数丢失

c# - 通过 SharePoint Web 服务在文件夹中添加权限

visual-studio-2008 - T4和TextTemplatingFileGenerator

sharepoint - 将文件拖放到 SharePoint Web 部件中以上传到 DocLibrary

Sharepoint 母版页 asp :repeater tag

c - fflush(stdin) 不能在 cygwin 中用 gcc 编译,但可以用 visual studio 2010 编译