Как передать имя метода пользовательскому серверному элементу управления в asp.net?
-
09-06-2019 - |
Вопрос
Я работаю над элементом управления Сервером клиента, который расширяет другой элемент управления.Нет никаких проблем с подключением к другим элементам управления в форме.
в 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, в котором хранится код страницы.
Я полагаю, вам нужно поддерживать несколько страниц, чтобы этот элемент управления был создан в Я полагаю, что вы можете найти дочерний тип любого экземпляра Страницы с помощью отражения, но я не помню как, но вы должны быть в состоянии это сделать.
но...как уже говорили все остальные, такой случай - это то, что Мероприятия предназначены для.