1

为了改善 SharePoint WCM 发布页面的编辑和显示体验,我希望能够在编辑模式下切换到一组特殊的 Masterpage/PageLayout。

所以在 /_catalogs/masterpage 我想要:

MyMasterpage.master - 显示模式的主页面 MyMasterpage-edit.master - 编辑模式的主页面,仅在可用时使用 MyPageLayout.aspx - 显示模式的页面布局 MyPageLayout-edit.aspx - 编辑模式的页面布局,仅在可用时使用

当我在 Pages 库中创建一个新的发布页面时,我选择了 MyPageLayout 页面布局。

渲染页面时,我想检测我是否处于编辑显示模式,就像服务器控件一样。此控件执行以下代码来确定呈现模式:

private void calculateShouldRender()
{
    SPControlMode contextualFormModeFromPostedForm = ConsoleUtilities.GetContextualFormModeFromPostedForm();
    if ((SPControlMode.Display == contextualFormModeFromPostedForm) && (PageDisplayMode.Display == this.PageDisplayMode))
    {
        this.shouldRender = true;
    }
    else if ((SPControlMode.Edit == contextualFormModeFromPostedForm) && (PageDisplayMode.Edit == this.PageDisplayMode))
    {
        this.shouldRender = true;
    }
    else
    {
        this.shouldRender = false;
    }
    this.Visible = this.shouldRender;
}

如果渲染模式是编辑,我想切换到 MyMasterpage-edit.master 母版页和 MyPageLayout-edit.aspx 页面布局。

我可以在由服务器控件控制的母版页和页面布局中进行重大切换,但我想拆分职责。SharePoint 分析员可以创建最佳的编辑模式页面,前端开发人员可以创建干净漂亮的显示模式页面,而不会造成编辑混乱。

关于如何做到这一点的任何想法?母版切换似乎不是问题,我曾经写过一篇关于此的博文。困难的事情似乎是页面布局的切换。

4

6 回答 6

1

我认为如果你继续沿着这条路线走下去,你将会与 SharePoint 作斗争,我担心它也会成为支持方面的噩梦,因为它变得不太清楚问题出在哪里,或者记住在发生某些事情时在两个(或所有四个!)地方进行更改已更新。

您可以根据页面的编辑模式显示或隐藏控件,因此向用户显示的内容完全不同,但页面的所有代码仍位于一个位置。

调查编辑模式面板。

<publishingwebcontrols:editmodepanel ID="Editmodepanel1" runat="server">
   <link id="Link2" rel=Stylesheet href="<% $SPUrl:~sitecollection/EditMode.css %>" runat="server" type="text/css" />
</publishingwebcontrols:editmodepanel>

我意识到这不是您所要求的……但我发现与 SharePoint 的战斗是一场失败的战斗,您只需要按照它的“方式”工作。

于 2009-06-11T16:35:31.567 回答
1

我曾经写过一个功能来根据不同的标准切换页面布局。不同之处在于,页面布局是在站点创建期间更改的,而不是在查看或编辑模式下。更改页面布局的代码如下:

    private void SetPageLayout(SPWeb web, string pageName, string pageLayoutName)
    {
        PageLayout layout = null;
        PublishingPage page = null;
        SPFile pageFile = null;
        bool checkedOut = false;

        try
        {
            PublishingWeb publishWeb = PublishingWeb.GetPublishingWeb(web);
            // verify that the requested pageLayout is available
            foreach (PageLayout pl in publishWeb.GetAvailablePageLayouts())
            {
                if (pl.Name.Equals(pageLayoutName, StringComparison.OrdinalIgnoreCase))
                {
                    layout = pl;
                    break;
                }
            }
            // got my layout
            if (layout != null)
            {
                page = null;
                foreach (PublishingPage pubPage in publishWeb.GetPublishingPages())
                {
                    if (pageName == pubPage.Name)
                    {
                        page = pubPage;
                        break;
                    }
                }
                // got my page
                if (page != null)
                {
                    pageFile = page.ListItem.File;

                    page.CheckOut();
                    checkedOut = true;

                    page.Layout = layout;
                    page.Update();

                    page.CheckIn("changed the page-layout to " + pageLayoutName);
                    checkedOut = false;

                    pageFile.Publish("");
                    // If required, approve the page
                    try
                    {
                        pageFile.Approve(string.Empty);
                    }
                    catch
                    {
                        // Page doesn't need to be approved
                    }
                }
            }
        }
于 2009-07-22T19:05:26.697 回答
0

我的文字对于评论框来说太长了,所以我在 Aiden 上回答就好像这是一个答案,但我的问题仍然存在!

您好 Aidan,我将 SharePoint 视为您可以在其中构建解决方案的平台。而且我认为微软在平台之上构建的WCM解决方案是薄弱的。我知道我的方式不是直接的 SharePoint 标准方式,但标准方式是行不通的。结合编辑和显示模式会导致(选择您的选择): - 标准的 SharePoint 发布网站,看起来都相似,但在编辑模式下工作正常 - 一个非常可编辑但外观非常基本的网站 - 一个在显示模式下看起来很棒的网站,这几乎是不可能编辑的 我们在显示模式下所需的样式表与 MOSS WCM 样式表之间存在很多冲突。我们确实编写了各种补偿样式表以使其正常工作,但这对 *** 来说是一个痛苦。在页面中注入带有样式的代码以使编辑成为可能,这是一个主要缺陷,这应该完全在您正在编辑的页面之外完成。例如,在 iframe 中,它可以显示为您正在编辑的页面顶部的浮动窗口。但这种情况并非如此。然后我什至没有提到您在页面上有标签或手风琴控件时遇到的问题。

我们的目标是真正具有交互性的 web 2.0 站点,其中必须进行大量内容管理。以 SharePoint 方式正确获取编辑模式是行不通的。

最佳的编辑体验是关键。那么为什么不使用为编辑优化的母版页和页面布局,以便以清晰一致的方式访问所有可编辑元素。但是你仍然需要显示模式。这可以使用一个完全独立的站点来完成,该站点仅使用 SharePoint 中生成的数据。这可以是一个 ASP.NET 站点,或者如果您想完全控制 html MVC,则可以使用。我不想那样做,因为它在导航、安全、控件的重用、Web 部件的使用等方面有很多影响。

我认为,如果使用针对编辑进行了优化的母版页/页面布局,并且另一对母版页/页面布局仅用于显示,并且页面布局中的代码集最少,我认为您将获得两全其美。

所以..请保持答案!

于 2009-06-11T21:02:31.520 回答
0

当然,这需要子类化 Microsoft.SharePoint.Publishing.PublishingLayoutPage 并根据“编辑模式”使用它来呈现所需的实际 PublishingLayoutPage 的内容。

如何更改母版页... ek。

于 2009-06-12T01:00:02.540 回答
0

试图再次让 SharePoint 服从您的意愿?;)

我感觉到你的痛苦。我正在使用两种方法来获得类似的行为:

我想像你建议的那样,有条件地渲染部分页面的容器控件。最初,当某些字段具有特定值时,我需要它来隐藏页面的某些部分,因此没有呈现 html。请参阅包装器控件。控件本身非常简单,它的类需要一个 [ParseChildren(false)],如果条件不满足,render 方法不会调用基础渲染。您可以扩展它以向编辑器和设计器显示一个完全不同的页面,尽管它们仍然存在于同一页面中。我想你可以去掉分析员使用的部分,把它放在自己的用户控件中,但这不是很容易维护。

其次,表单页面,例如“/Pages/Forms/EditForm.aspx?ID=1”,提供了发布页面上所有字段的清晰视图。没有设计阻碍。(我在所有页面布局上使用了一个控件,该控件提供对这个和当前页面库的一键访问,并显示使用的内容类型和页面布局。在构建 WCM 站点时非常有用。)

于 2009-06-14T02:26:28.400 回答
0

这个问题的最终答案现在被“烘焙”到我们称之为 SharePoint 的 DualLayout 的产品中!我们的方法解决了您所有的 SharePoint WCM 设计噩梦:

  • 除了 WCM 编辑和显示视图之外,还为最终用户引入了一个附加视图
  • SharePoint 样式与您自己的样式之间永远不会发生冲突
  • 制作不干扰 WCM 母版页和页面布局的精简和平均“查看”母版页和页面布局
  • 为最终用户制作超轻页面,消除所有 SharePoint 特定页面混乱
  • 提高页面的性能,因为我们只有最少量的控件可以在最终用户视图中呈现

在http://www.macaw.nl/Het+Bedrijf/Producten/Macaw+DualLayout+for+SharePoint.aspx查看它,有关详细背景信息,请参阅该页面博客卷中的博客文章。

于 2011-02-27T12:56:46.983 回答