在功能激活期间在页面布局中部署两个连接的Web部件?

时间:2011-03-01 01:29:51

标签: sharepoint layout web-parts

我已经实现了2个webparts(派生自Microsoft.SharePoint.WebPartPages.WebPart,WSS 3 WebPart),其中一个是提供者,另一个是消费者(使用 ConnectionProviderAttribute实现ASP.net连接模型) ConnectionConsumerAttribute 方法)。

我设法将它们部署在一个功能中,该功能还部署了包含两个webpart区域的页面布局,这两个区域本身在功能接收器的FeatureAvtivated方法中填充,带有2个新创建的webpart。所有这些都很好。

有关信息,我使用this link使其正常工作。请注意,在 elements.xml 中使用 AllUsersWebPart 标记的方法,如此链接所示(http://www.andrewconnell.com/blog/archive/2007/10 /07/Having-Default-Web-Parts-in-new-Pages-Based-Off-Page.aspx)工作,但如果您停用,然后重新激活您的功能,您只需在将来的页面中根据布局设置两个webpart 。这里描述的方法(http://sharepoint.coultress.com/2008/06/adding-web-part-to-page-layout.html)只是在分析布局aspx文件的元数据时给我一个错误(问题似乎来自ZoneTemplate标签中的行。)

我的下一个目标是在这一切之后立即将这些网页部件连接在一起,从而使最终用户能够根据布局创建网页,其中包含默认情况两个网站部件已连接在一起(现在除了连接部分外,一切都有效)。

我尝试了类似this的东西,使用ASP.net连接模型(另一个,WSS模型,逻辑上抛出错误,因为我没有实现好的接口)。但即使由“mgr.SPConnectWebParts()”方法产生的连接没有抛出任何异常并实际将连接添加到webpart管理器的连接列表,我可以在调试模式中看到连接属性'IsActive'是false(可能是正常的),当我根据布局创建新页面时,webparts似乎没有连接。

有什么猜测?我相信有一些事实是在实际创建包含它们的页面之前无法连接webparts,但我对它很不确定。

3 个答案:

答案 0 :(得分:2)

声明式Web部件连接配置实际上非常简单:

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="Module1">
    <File Path="Module1\default.aspx" Url="demo.aspx">
      <AllUsersWebPart ID="testProvider">...</AllUsersWebPart>
      <AllUsersWebPart ID="testConsumer">...</AllUsersWebPart>
      <WebPartConnection ID="testConnection"
                         ProviderID="testProvider"
                         ProviderConnectionPointID="providerID"
                         ConsumerID="testConsumer"
                         ConsumerConnectionPointID="consumerID" />
     </File>
  </Module>
</Elements>

详细说明: http://blogs.code-counsel.net/Wouter/Lists/Posts/Post.aspx?ID=161

如果您先手动连接Web部件,则可以使用PowerShell查找连接点ID:

$web = Get-SPWeb <WebURL>
$wpman = $web.GetLimitedWebPartManager("<PageURL>", [System.Web.UI.WebControls.WebParts.PersonalizationScope]::Shared)
$wpman.SPWebPartConnections

答案 1 :(得分:0)

尝试以编程方式在页面上创建Web部件?你会比以声明方式做出更少的麻烦。

查找SPLimitedWebPartManager类,了解如何处理已配置页面上的Web部件。

此外,Web部件区域中的Web部件与添加它们的页面的 URL相关联。这是ASP.NET Web部件管理器的设计。

因此,如果您将网页部件添加到目录中的页面布局上的区域:http://webapp/sites/site/_catalog/master/mypagelayout.aspx - Web部件将仅显示在该页面上。在/sites/site/Pages/MyPage.aspx上创建新页面,之前添加的Web部件将不会显示。解决方法是明确添加不在Web部件区域内的Web部件,这只能在创作的页面布局中完成(通常在SharePoint Designer中)。

如果Web部件在页面布局中是静态的(并且您希望它们显示在每个页面中),那么这实际上更容易部署 - 只需在源中维护布局,并通过Module元素进行配置

答案 2 :(得分:0)

最后,我用另一种方法来实现我的目标。在提供者webpart的OnLoad事件中,我检查我的页面是否处于编辑/新模式,然后检查页面是否包含消费者webpart(通过webpartmanager)以及它们是否尚未连接。如果是这种情况,我会将它们连接起来。

永久连接webparts的代码:

private void SetUpConnections()
{
    SPSecurity.RunWithElevatedPrivileges(delegate() {
        using (SPSite siteContext = new SPSite(SPContext.Current.Site.ID))
        using (SPWeb webContext = siteContext.OpenWeb(siteContext.ServerRelativeUrl))
        using (SPLimitedWebPartManager spManager = webContext.GetFile(SPContext.Current.File.Url).GetLimitedWebPartManager(PersonalizationScope.Shared))
        {
            foreach (Microsoft.SharePoint.WebPartPages.WebPart consumer in spManager.WebParts)
            {
                if (consumer is MyConsumerWebPart)
                {
                    bool alreadyConnected = false;
                    Microsoft.SharePoint.WebPartPages.WebPart provider = spManager.WebParts[this.ID] as Microsoft.SharePoint.WebPartPages.WebPart;
                    foreach (SPWebPartConnection connection in spManager.SPWebPartConnections)
                    {
                        if (connection.Provider == provider && connection.Consumer == consumer) { alreadyConnected = true; break; }
                    }
                    if (!alreadyConnected)
                    {
                        // Connects webparts permanently (but the page would need a reload to display the connection)
                        ProviderConnectionPoint providerConnectionPoint = spManager.GetProviderConnectionPoints(provider)["MyConnectionProviderInterfaceId"];
                        ConsumerConnectionPoint consumerConnectionPoint = spManager.GetConsumerConnectionPoints(consumer)["MyConnectionConsumerInterfaceId"];
                        spManager.SPConnectWebParts(provider, providerConnectionPoint, consumer, consumerConnectionPoint);

                        // Connects webparts locally (for current edit mode)
                        SPWebPartManager currentSPManager = WebPartManager.GetCurrentWebPartManager(this.Page) as SPWebPartManager;
                        System.Web.UI.WebControls.WebParts.WebPart currentProvider = this;
                        System.Web.UI.WebControls.WebParts.WebPart currentConsumer = currentSPManager.WebParts[consumer.ID];
                        ProviderConnectionPoint currentProviderConnectionPoint = currentSPManager.GetProviderConnectionPoints(currentProvider)["SearchBarProvider"];
                        ConsumerConnectionPoint currentConsumerConnectionPoint = currentSPManager.GetConsumerConnectionPoints(currentConsumer)["SearchBarConsumer"];
                        currentSPManager.SPConnectWebParts(currentProvider, currentProviderConnectionPoint, currentConsumer, currentConsumerConnectionPoint);
                    }
                }
            }
        }
    });
}

检查页面是否处于新/编辑模式的代码:

if (SPContext.Current.FormContext.FormMode == SPControlMode.New
    || SPContext.Current.FormContext.FormMode == SPControlMode.Edit)
{
    this.SetUpConnections();
}