以编程方式修改Sharepoint非发布默认页面内容

本文关键字:默认 布默认 方式 编程 修改 Sharepoint | 更新日期: 2023-09-27 18:10:15

我需要修改默认的内容。在超过100个SharePoint 2010网站的aspx页面上做一个轻微的内容改变。

因为网站的数量,我想用编程的方式来做,要么在PowerShell中,要么通过编程一个控制台应用程序或类似的东西。

我发现很多网站/博客都描述了如何在pages库中查找默认页面,但这对我来说不起作用,因为即使这些网站有发布功能,pages库中也没有文件,而且据我所知,它不是wiki页面。

我试图修复的问题是,在ListViewXml标签的列表在主页上没有形成正确的。它在url中有两个?'s(查询字符串),我只是想替换"?RootFolder=" to "&RootFolder="

到目前为止,我已经尝试运行一个c#控制台,我已经能够找到默认值。但是我得到的内容不是所有的内容,只是结构。
 using (SPSite siteCollection = new SPSite("my_site_url"))
 {
      SPWebCollection sites = siteCollection.AllWebs;
      foreach (SPWeb site in sites)
      {
           try
           {
                SPFile file = site.GetFile(site.Url + "/default.aspx");
                System.IO.Stream myStream = file.OpenBinaryStream();
                System.IO.StreamReader reader = new System.IO.StreamReader(myStream);
                string text = reader.ReadToEnd();
                Console.WriteLine(text);
           }
           finally
           {
                if (site != null)
                site.Dispose();
            }

我只是将文本输出到控制台以进行测试。我希望我可以做一个字符串替换,并把内容写回文件,并以某种方式保存它。

解决方案不一定是c#,我只需要一些自动化的方式来改变许多网站的主页,这似乎是最有希望的路线。目前我在SharePoint Designer中手动打开页面,做一个查找替换,然后点击保存按钮,这是非常繁琐的。

以编程方式修改Sharepoint非发布默认页面内容

经过更多的搜索和头部撞击,我能够解决这个问题。

发现我实际上不能修改页面的代码。我需要修改页面上列表的xml,特别是列表工具栏的xml,甚至更具体地说是视图工具栏的xml。

下面的大部分代码来自http://www.sharepointchick.com/archive/2009/07/24/programmatically-adjusting-the-toolbar-of-a-listviewwebpart.aspx

最后的代码是:

        SPSite siteCollection1 = new SPSite(<site>);

        SPWeb myWebs = siteCollection1.OpenWeb();
        foreach (SPWeb webItem in myWebs.Webs)
        {
            SPFile myFile = webItem.GetFile("default.aspx");

            SPLimitedWebPartManager limitedWebPartManager = myFile.GetLimitedWebPartManager(System.Web.UI.WebControls.WebParts.PersonalizationScope.Shared);

            // Get all web parts that are available on the default.aspx page
            SPLimitedWebPartCollection webParts = limitedWebPartManager.WebParts;
            // Loop through the collection of all web parts on the page
            foreach (System.Web.UI.WebControls.WebParts.WebPart webPartOnPage in webParts)
            {
                // Only try to set the toolbar type is the web part is a ListViewWebPart, other web part types don't have toolbars
                if (webPartOnPage.GetType().Name == "ListViewWebPart")
                {
                    ListViewWebPart listViewWebPart = webPartOnPage as ListViewWebPart;

                    // Get the view used in the web part by using reflection
                    PropertyInfo viewProp = listViewWebPart.GetType().GetProperty("View", BindingFlags.NonPublic | BindingFlags.Instance);
                    SPView webPartView = viewProp.GetValue(listViewWebPart, null) as SPView;

                    // This is necessary after the infrastructure update, without it you can't get to the XML of the view
                    webPartView.GetType().InvokeMember("EnsureFullBlownXmlDocument", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, null, webPartView, null, System.Globalization.CultureInfo.CurrentCulture);
                    PropertyInfo nodeProp = webPartView.GetType().GetProperty("Node", BindingFlags.NonPublic | BindingFlags.Instance);
                    XmlNode node = nodeProp.GetValue(webPartView, null) as XmlNode;
                    // Get the toolbar node from the XML of the view used in the web part
                    XmlNode toolbarNode = node.SelectSingleNode("Toolbar");
                    if (toolbarNode != null)
                    {
                        toolbarNode.InnerXml = toolbarNode.InnerXml.Replace("?RootFolder", "&amp;RootFolder");
                        webPartView.Update();
                    }
                }
            }
        }