SharePoint / WSS3.0: создание статических соединений веб-частей во время выполнения - PullRequest
1 голос
/ 24 мая 2010

Я создал несколько основных / подробных веб-частей, которые необходимо подключить. У нас есть требование, чтобы веб-части самостоятельно обнаруживали и подключались к другим подключаемым веб-частям на странице. Я достиг этого на стандартной странице ASP.NET со следующим кодом:

protected override void OnLoad(EventArgs e)
{    
    WebPartManager manager = WebPartManager.GetCurrentWebPartManager(Page);
    manager.StaticConnections.Add(new WebPartConnection()
    {
        ID = string.Format("WebPartConnection{0}{1}", this.ID, provider.ID),
        ConsumerID = this.ID,
        ConsumerConnectionPointID = "WebPartConnectableConsumer",
        ProviderID = provider.ID,
        ProviderConnectionPointID = "WebPartConnectableProvider"
    });
}

Однако этот подход не работает в SharePoint. Использование версии этих объектов для SharePoint приводит к общей ошибке sharepoint:

protected override void OnLoad(EventArgs e)
{    
    SPWebPartManager spManager = SPWebPartManager.GetCurrentWebPartManager(Page) as SPWebPartManager;
    spManager.StaticConnections.Add(new WebPartConnection()
    {
        ID = string.Format("WebPartConnection{0}{1}", this.ID, provider.ID),
        ConsumerID = this.ID,
        ConsumerConnectionPointID = "WebPartConnectableConsumer",
        ProviderID = provider.ID,
        ProviderConnectionPointID = "WebPartConnectableProvider"
    });
}

Следующий подход работает, но создает соединение как часть персонализации пользователя:

protected override void OnLoad(EventArgs e)
{
    SPWebPartConnection connection = (from SPWebPartConnection c in spManager.SPWebPartConnections where c != null && c.Consumer == this && c.ConsumerConnectionPointID == "WebPartConnectableConsumer" && c.Provider == provider select c).FirstOrDefault();
    if (connection == null)
    {
        try
        {
            ProviderConnectionPointCollection providerCollections = spManager.GetProviderConnectionPoints(provider);
            ConsumerConnectionPointCollection consumerConnections = spManager.GetConsumerConnectionPoints(this);
            connection = spManager.SPConnectWebParts(provider, providerCollections["WebPartConnectableProvider"], this, consumerConnections["WebPartConnectableConsumer"]);
        }
        catch { }
    }
}

1 Ответ

0 голосов
/ 25 мая 2010

В журналах скрыта ошибка, в которой говорится, что свойство StaticConnections нельзя использовать в средах SharePoint / WSS. Вместо этого следует использовать свойство SPWebPartConnections. Кроме того, соединения должны быть добавлены до события загрузки (например, OnInit).

Рабочий код:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    SetUpProviderConnection();
}

private bool SetUpProviderConnection()
{
    bool connectionCreated = false;

    WebPartManager manager = WebPartManager.GetCurrentWebPartManager(Page);
    foreach (System.Web.UI.WebControls.WebParts.WebPart webPart in manager.WebParts)
    {
        BaseWebPart provider = webPart as BaseWebPart;
        if (provider != null && (provider != this))
        {
            if (manager is Microsoft.SharePoint.WebPartPages.SPWebPartManager)
            {
                SPWebPartManager spManager = SPWebPartManager.GetCurrentWebPartManager(Page) as SPWebPartManager;

                spManager.SPWebPartConnections.Add(new SPWebPartConnection()
                {
                    ID = string.Format("WebPartConnection{0}{1}", this.ID, provider.ID),
                    ConsumerID = this.ID,
                    ConsumerConnectionPointID = "WebPartConnectableConsumer",
                    ProviderID = provider.ID,
                    ProviderConnectionPointID = "WebPartConnectableProvider"
                });
            }
            else
            {
                manager.StaticConnections.Add(new WebPartConnection()
                {
                    ID = string.Format("WebPartConnection{0}{1}", this.ID, provider.ID),
                    ConsumerID = this.ID,
                    ConsumerConnectionPointID = "WebPartConnectableConsumer",
                    ProviderID = provider.ID,
                    ProviderConnectionPointID = "WebPartConnectableProvider"
                });
            }
            connectionCreated = true;
        }
    }
    return connectionCreated;
}
...