我已经实现了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,但我对它很不确定。
答案 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();
}