【问题标题】:Creating Group Page Programmatically Sitefinity Backend以编程方式创建组页面 Sitefinity 后端
【发布时间】:2014-02-24 18:25:32
【问题描述】:

我进行了搜索,但找不到任何有关如何在 sitefinity API 中创建群组页面的文档。我知道如何以编程方式创建页面。

    var pageDataId = Guid.NewGuid();

    PageManager manager = PageManager.GetManager();
    PageData pageData = null;
    PageNode pageNode = null;

    // Get the parent node Id
    if (parentPageNodeId == Guid.Empty)
    {
        parentPageNodeId = SiteInitializer.CurrentFrontendRootNodeId;
    }

    PageNode parent = manager.GetPageNode(parentPageNodeId);

    // Check whether exists
    var initialPageNode = manager.GetPageNodes().Where(n => n.Id == pageId).SingleOrDefault();

    if (initialPageNode != null)
    {
        return;
    }

    // Create the page
    pageData = manager.CreatePageData(pageDataId);
    pageData.HtmlTitle = pageName;
    pageData.Title = pageName;
    pageData.Description = pageName;
    pageData.Culture = Thread.CurrentThread.CurrentCulture.ToString();
    pageData.UiCulture = Thread.CurrentThread.CurrentUICulture.ToString();

    pageNode = manager.CreatePage(parent, pageId, NodeType.Standard);
    pageNode.Page = pageData;
    pageNode.Name = pageName;
    pageNode.Description = pageName;
    pageNode.Title = pageName;
    pageNode.UrlName = Regex.Replace(pageName.ToLower(), @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-");
    pageNode.ShowInNavigation = true;
    pageNode.DateCreated = DateTime.UtcNow;
    pageNode.LastModified = DateTime.UtcNow;

    // Check whether home page
    if (isHomePage)
    {
        SystemManager.CurrentContext.CurrentSite.SetHomePage(pageId);
    }

    manager.SaveChanges();

    // Publish
    var bag = new Dictionary<string, string>();
    bag.Add("ContentType", typeof(PageNode).FullName);
    WorkflowManager.MessageWorkflow(pageId, typeof(PageNode), null, "Publish", false, bag);
}

这将创建一个常规页面。我尝试将 NodeType 从标准更改为 NodeType.Group 并将其余代码保持原样。但是,这会引发异常“当前页面不是标准页面”。我一直在寻找 pageNode 属性以使该页面成为组页面而不是常规页面,但我找不到任何内容。如果有人知道如何做到这一点,我将不胜感激。

【问题讨论】:

    标签: c# asp.net sitefinity


    【解决方案1】:

    可能是因为您试图为创建的 Group 节点创建 PageData 而引发异常。我认为 Group 节点没有页面数据,而仅用于对其他页面节点进行分组。

    尝试删除 pageData 的创建和分配给 PageGroup.Page 属性,这样您就可以保存创建的页面节点。

    此外,如果您安装了sitefinity SDK,资源文件夹中有一个 SampleUtilities 类,其中包含许多用于创建页面、模板等的帮助方法,可作为使用 API 的绝佳参考点。

    希望对你有帮助!

    【讨论】:

      【解决方案2】:

      这是一些可能对您有所帮助的代码:

      // Define our new view
              var templateIconView = new TemplateIconView { ID = TemplateIconViewControlId };
      
              var pageManager = PageManager.GetManager();
              pageManager.Provider.SuppressSecurityChecks = true;
      
              // Get the root
              var parentNode = pageManager.GetPageNode(SiteInitializer.SitefinityNodeId);
      
              // Check whether exists
              var initialPageNode = pageManager.GetPageNodes().SingleOrDefault(n => n.Id == AdditionalToolsPageId);
              if (initialPageNode != null) {
      
                  pageManager.Delete(initialPageNode);
                  pageManager.SaveChanges();
      
              }
      
              var homePageNode = pageManager.GetPageNodes().SingleOrDefault(n => n.Id == HomePageId);
              if (homePageNode != null) {
      
                  pageManager.Delete(homePageNode);
                  pageManager.SaveChanges();
              }
      
              // Create the Group Page Node
              var groupPageNode = pageManager.CreatePage(parentNode, AdditionalToolsPageId, NodeType.Group);
              groupPageNode.Name = "KonstruiTools";
              groupPageNode.Description.SetString("Konstrui Tools", true);
              groupPageNode.Title.SetString("Konstrui Tools", true);
              groupPageNode.UrlName = Regex.Replace("Konstrui Tools", @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-").ToLower();
              groupPageNode.ShowInNavigation = true;
              groupPageNode.DateCreated = DateTime.UtcNow;
              groupPageNode.LastModified = DateTime.UtcNow;
      
              pageManager.SaveChanges();
      
              // Create the actual page PageData
              var pageData = pageManager.CreatePageData(HomePageId);
              pageData.HtmlTitle = "Configure Template Icons";
              pageData.Title = "Configure Template Icons";
              pageData.Description = "Configure Template Icons";
              pageData.Culture = Thread.CurrentThread.CurrentCulture.ToString();
              pageData.UiCulture = Thread.CurrentThread.CurrentUICulture.ToString();
              pageData.EnableViewState = true;
              pageData.EnableViewStateMac = true;
      
              // Add our control to the page with default permissions
              var control = pageManager.CreateControl<PageControl>(templateIconView, Constants.VALUE_DEFAULT_BACKEND_PLACEHOLDER);
              pageManager.SetControlDefaultPermissions(control);
              pageData.Controls.Add(control);
      
              // Assign the Default Backend Template
              pageData.Template = pageManager.GetTemplate(SiteInitializer.DefaultBackendTemplateId);
      
              // Create the actual page PageNode
              var pageNode = pageManager.CreatePage(groupPageNode, HomePageId, NodeType.Standard);
              pageNode.Page = pageData;
              pageNode.Name = "ConfigureTemplateIcons";
              pageNode.Description = "Configure Template Icons";
              pageNode.Title = "Configure Template Icons";
              pageNode.UrlName = Regex.Replace("Configure Template Icons", @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-").ToLower();
              pageNode.ShowInNavigation = true;
              pageNode.DateCreated = DateTime.UtcNow;
              pageNode.LastModified = DateTime.UtcNow;
              pageNode.RenderAsLink = true;
      
              pageManager.SaveChanges();
      
              // Publish
              var bag = new Dictionary<string, string>();
              bag.Add("ContentType", typeof(PageNode).FullName);
              WorkflowManager.MessageWorkflow(HomePageId, typeof(PageNode), null, "Publish", false, bag);
      
      
              pageManager.Provider.SuppressSecurityChecks = false;
      

      这会在 rootlevel 的后端内创建一个 grouppage,其中包含另一个带有控件的页面。

      【讨论】:

      • 您的 AdditionalToolsPageId 来自哪里?可以发布吗?
      • 没关系,我能够弄清楚我需要什么。感谢您的帖子,它确实引导我找到解决方案。
      【解决方案3】:

      这就是我最终要做的事情。它将在另一个组页面下创建一个组页面,这正是我需要的。

                      var pageId = Guid.NewGuid();
      
                      PageManager manager = PageManager.GetManager();
      
                      PageNode pageNode = null;
      
                      //Find the modules section which will serve as the 
                      //parent page.
                      string pageTitle = ConfigurationManager.AppSettings["ModulesSection"].ToString();
      
                      //Gets the actual Modules page.
                      var modulesNode = SitefinityHelper.GetPageNode(pageTitle);
      
                      if (modulesNode.Id == Guid.Empty)
                      {
                          modulesNode.Id = SiteInitializer.CurrentFrontendRootNodeId;
                      }
      
                      PageNode modulesPage = manager.GetPageNode(modulesNode.Id);
      
                      // Check whether exists
                      var initialPageNode = manager.GetPageNodes().Where(n => n.Id ==     
                      pageId).SingleOrDefault();
      
                      if (initialPageNode != null)
                      {
                          return false;
                      }
      
                      //Creates the page under the Modules section as a Group Page.
                      pageNode = manager.CreatePage(modulesPage, pageId, NodeType.Group);
      
                      pageNode.Name = newModule.Name;
                      pageNode.Description = newModule.Description;
                      pageNode.Title = newModule.Name;
                      pageNode.UrlName = Regex.Replace(newModule.Name.ToLower(), @"[^\w\-\!\$\'\(\)\=\@\d_]+", "-");
                      pageNode.ShowInNavigation = true;
                      pageNode.DateCreated = DateTime.UtcNow;
                      pageNode.LastModified = DateTime.UtcNow;
                      manager.SaveChanges();e here
      

      【讨论】:

        【解决方案4】:

        您可以使用 fluent API 创建群组页面。 fluent API 中给出的简单方法

        App.WorkWith()
            .Page()
            .CreateNewPageGroup()
            .Do(x => x.Title = "Testpage2")
            .Do(x => x.Name = "Testpage2")
            .Do(x => x.UrlName = "testpage2")
            .SaveChanges();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-08
          • 2011-04-30
          • 1970-01-01
          相关资源
          最近更新 更多