Создать SharePoint (2010) ToolPart, который можно использовать более чем для одной веб-части

Я использую основные инструкции (здесь) для создания свойства, управляемого настраиваемым ToolPart.

Все хорошо, за исключением той части, где для доступа к свойству webpart в методе ApplyChanges я должен вернуть this.ParentToolPane.SelectedWebPart к конкретному классу SimpleWebPart.

public override void ApplyChanges()
{
    SimpleWebPart wp1 = (SimpleWebPart)this.ParentToolPane.SelectedWebPart;

// Send the custom text to the Web Part.
    wp1.Text = Page.Request.Form[inputname];
}

Это означает, что я должен связать каждую часть инструментов с определенной веб-частью. Есть ли способ лучше? Я не могу создать интерфейс, так как в нем невозможно указать свойство.

Я неудачно попытался передать событие / обработчик событий во время создания инструментальной части, но это не привело к обновлению свойства webpart при вызове.

Я мог бы создать базовый класс для всех веб-частей, у которых есть общедоступное свойство «Текст», но это ненадежно.

Я также мог впасть в отчаяние и взломать ссылку this.ParentToolPane.SelectedWebPart с помощью Reflection и таким образом вызвать любые свойства с именем «Text».

В любом случае, я смотрю на бочку изрядной долги, только чтобы понять, что каждый вариант - это тупик.

Кто-нибудь сделал это и может порекомендовать правильный метод создания многоразового инструмента?


person Nat    schedule 29.11.2011    source источник
comment
В чем проблема с базовой веб-частью / инструментальной частью и наследованием / переопределением по мере необходимости?   -  person Ryan    schedule 29.11.2011
comment
ничего, пока мне не понадобится запустить несколько различных комбинаций свойств с несколькими разными инструментами.   -  person Nat    schedule 30.11.2011
comment
Это правда, но, может быть, вы сможете получить 80% таких обычных родственных свойств? Зависит от вашего конкретного варианта использования. Должен сказать, без обид, но я боюсь, что вы можете получить дело с архитектором Астраунатисом;) (через абстракцию) - joelonsoftware.com/items/2008/05/01.html   -  person Ryan    schedule 30.11.2011
comment
Я сомневаюсь, что попытка применить принцип инверсии зависимостей заходит слишком далеко.   -  person Nat    schedule 02.12.2011
comment
Что ж, мой вопрос - сколько времени вы потратили на изучение этого и сколько времени потребовалось бы, чтобы сделать это «легким» способом? Я понятия не имею, насколько сложны ваши инструменты и сколько разных версий будет, поэтому нет смысла вступать в дебаты - это было просто мое неосведомленное «внутреннее» чувство. Однако столь возвышенное опровержение ее усиливает;)   -  person Ryan    schedule 02.12.2011
comment
Справедливо. Инстинктивно я чувствовал, что это проблема, с которой мне будет достаточно, и приложить некоторые усилия к твердому решению, которые окупятся в долгосрочной перспективе.   -  person Nat    schedule 05.12.2011


Ответы (1)


Я использовал интерфейс вместо конкретного экземпляра веб-части.

private class IMyProperty
{
    void SetMyProperty(string value);
}

public override void ApplyChanges()
{
    IMyProperty wp1 = (IMyProperty)this.ParentToolPane.SelectedWebPart;

    // Send the custom text to the Web Part.
    wp1.SetMyProperty(Page.Request.Form[inputname]);
}

Но это не дает предупреждения во время компиляции о том, что инструментальная часть требует, чтобы родительская веб-часть реализовала интерфейс IMyProperty.

Простое решение - добавить свойство интерфейса IMyProperty в конструктор инструментальной части и вызвать эту ссылку вместо свойства this.ParentToolPane.SelectedWebPart.

public ToolPart1(IContentUrl webPart)
{
    // Set default properties              
    this.Init += new EventHandler(ToolPart1_Init);
    parentWebPart = webPart;
}

public override void ApplyChanges()
{
    // Send the custom text to the Web Part.
    parentWebPart.SetMyProperty(Page.Request.Form[inputname]);
}

public override ToolPart[] GetToolParts()
{
    // This is the custom ToolPart.
    toolparts[2] = new ToolPart1(this);
    return toolparts;
}

Это работает нормально, но я не могу избавиться от ощущения, что в базовом коде SharePoint есть что-то неприятное, что может сбить меня с толку позже.

person Nat    schedule 01.12.2011