Как передать имя метода пользовательскому серверному элементу управления в asp.net?

StackOverflow https://stackoverflow.com/questions/33150

Вопрос

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

в vb.net: Parent.FindControl(TargetControlName)

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

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

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

Что-то вроде (в 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")

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


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

Это было полезно?

Решение

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

VB.NET

<Browsable(True)> Public Event InitializeStuffCallback

C#

[Browsable(true)]
public event EventHandler InitializeStuffCallback;

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

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

Другие советы

Обычно вам не нужно было бы получать метод с помощью отражения.Внутри вашего пользовательского элемента управления определите общедоступное событие (извините, я не знаю синтаксиса 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">

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

у буютека и Джесси Диринга есть приемлемый ответ.

[Browsable(true)]  

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

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

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

class MyPage : Page

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top