Я разрабатываю настраиваемый серверный элемент управления в Asp.NET (.NET 3.5), который наследует класс CompositeControl. В моем элементе управления я переопределяю метод CreateChildControls()
для создания смеси серверных элементов управления html и Asp.NET. Некоторые из добавленных элементов управления Asp.NET - это LinkButton
s (каждый из которых имеет свой Command
обработчик событий, установленный на метод в моем элементе управления). Я обнаружил, что при первом щелчке по одному из этих LinkButton запускается обратная передача, и метод обработчика событий запускается правильно. Внутри этого обработчика событий метод CreateChildControls () явно вызывается для восстановления элемента управления в ответ на обратную передачу. Затем я обнаружил, что последующие щелчки обратных передач LinkButton
s не приводят к возникновению метода обработчика событий.
Я предполагаю, что способ, которым я обрабатываю регенерацию элемента управления при обратной передаче, должен быть виноват, но я не могу понять, что делать - я знаю, что при первой обратной передаче 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();
}
}
РЕДАКТИРОВАТЬ Проблема здесь была вызвана тем фактом, что элемент управления используется на сайте 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>