Как передать имя метода в пользовательский серверный элемент управления в asp.net? - PullRequest
1 голос
/ 28 августа 2008

Я работаю над клиентским серверным элементом управления, который расширяет другой элемент управления. Нет проблем с присоединением к другим элементам управления в форме.

в vb.net: Parent.FindControl(TargetControlName)

Я хотел бы передать метод в элемент управления в разметке ASPX.

например: <c:MyCustomerControl runat=server InitializeStuffCallback="InitializeStuff">

Итак, я попытался использовать отражение для доступа к данному имени метода из Parent.

Что-то вроде (в VB)

Dim pageType As Type = Page.GetType
Dim CallbackMethodInfo As MethodInfo = pageType.GetMethod( "MethodName" )

'Also tried 
sender.Parent.GetType.GetMethod("MethodName")
sender.Parent.Parent.GetType.GetMethod("MethodName")

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


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

Ответы [ 5 ]

2 голосов
/ 28 августа 2008

Если вы хотите иметь возможность передавать метод в разметке ASPX, вам нужно использовать атрибут Browsable в своем коде для события.

VB.NET

<Browsable(True)> Public Event InitializeStuffCallback

C #

[Browsable(true)]
public event EventHandler InitializeStuffCallback;

Ссылка: Атрибуты времени разработки для компонентов и Класс BrowsableAttribute

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

2 голосов
/ 28 августа 2008

Обычно вам не нужно получать метод с помощью отражения. Внутри вашего пользовательского элемента управления определите публичное событие (извините, я не знаю синтаксис vb, так что это будет в c #)

public event EventHandler EventName;

Теперь внутри вашей страницы aspx или любого другого контейнера пользовательского элемента управления определите защищенный метод, который соответствует EventHandler:

protected void MyCustomerControl_MethodName(object sender, EventArgs e) { }

Теперь внутри вашей разметки вы можете использовать

<c:MyCustomerControl id="MyCustomerControl" runat=server OnEventName="MyCustomerControl_MethodName">
0 голосов
/ 29 августа 2008

buyutec и Jesse Dearing оба имеют приемлемый ответ.

[Browsable(true)]  

позволяет увидеть свойство в окне свойств. Тем не менее, событие не появляется, что не имеет значения для меня.

Ранее я упустил из виду тот факт, что когда вы ссылаетесь на элемент управления даже из тега, он готовится к концу.

0 голосов
/ 28 августа 2008

Каждая страница ASP.NET является собственным классом , унаследованным от Page как в:

class MyPage : Page

Поэтому, чтобы найти этот метод с помощью Reflection, вы должны получить правильный тип, который является типом класса страницы, в котором хранится код страницы.

Полагаю, вам нужно поддерживать несколько страниц для создания экземпляра этого элемента управления. Я полагаю, что вы можете найти дочерний тип любого экземпляра Page с помощью Reflection, но я не помню как, но вы должны быть в состоянии это сделать.

но ... как все говорили, такой случай - это то, для чего события .

0 голосов
/ 28 августа 2008

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

...