Я разрабатываю собственный серверный элемент управления в Asp.NET (.NET 3.5), который наследует класс CompositeControl.Внутри моего элемента управления я переопределяю метод CreateChildControls()
, чтобы создать смесь элементов управления html и сервера Asp.NET.Некоторые из добавленных элементов управления Asp.NET: LinkButton
s (для каждого из них обработчик события Command
установлен на метод в моем элементе управления).Я обнаружил, что при первом нажатии на один из этих LinkButtons запускается обратная передача, и метод обработчика событий запускается правильно.Внутри этого обработчика событий метод CreateChildControls () явно вызывается для регенерации элемента управления в ответ на обратную передачу.Затем я обнаружил, что последующие щелчки постбэков LinkButton
не могут вызвать метод обработчика событий.
Я предполагаю, что способ обработки регенерации элемента управления при обратной передаче должен быть ошибочным,но я не могу понять, что делать - я осознаю тот факт, что при первой обратной передаче CreateChildControls () вызывается дважды, что, вероятно, не идеально, но, поскольку CreateChildControls вызывается до возникновения каких-либо событий, я не вижуспособ обойти это.
Упрощенная версия моего класса управления показана ниже:
public class SearchResults : CompositeControl
{
private int PageIndex = 0;
protected override void CreateChildControls()
{
//do stuff here e.g.
LinkButton prevLink = new LinkButton();
prevLink.Text = "< Prev";
prevLink.CommandArgument = (PageIndex - 1).ToString();
prevLink.Command += new CommandEventHandler(PagerLinkCommand);
this.Controls.Add(prevLink);
}
protected void PagerLinkCommand(object sender, CommandEventArgs e)
{
PageIndex = int.Parse(e.CommandArgument.ToString());
CreateChildControls();
}
}
EDIT Проблема была вызвана тем, что элемент управленияиспользуется на сайте Sitecore, и я забыл зарегистрировать тип элемента управления в файле web.config с записью <typesThatShouldNotBeExpanded>
.Эта запись используется, чтобы предотвратить испорченные событиями для серверных элементов управления Sitecore - это может вызвать аналогичные проблемы для стандартных серверных элементов управления, таких как ListView, GridView, Repeater и т. Д. Мой web.config был изменен, как показано ниже:
<typesThatShouldNotBeExpanded>
<type>System.Web.UI.WebControls.Repeater</type>
<type>System.Web.UI.WebControls.DataList</type>
<type>System.Web.UI.WebControls.GridView</type>
<type>MyNamespace.MyCustomControl</type> <!-- This is the bit I added -->
</typesThatShouldNotBeExpanded>