Пользовательский обработчик событий управления сервером Asp.NET не запускается при второй обратной передаче - PullRequest
0 голосов
/ 13 мая 2011

Я разрабатываю собственный серверный элемент управления в 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>

Ответы [ 4 ]

1 голос
/ 13 мая 2011

По моему опыту, такого рода проблемы обычно возникают из-за того, что ID не назначается динамически сгенерированным элементам управления.

LinkButton prevLink = new LinkButton();
prevLink.ID = "prevLink";
1 голос
/ 17 мая 2011

Извинения ... это не полный ответ, а предложение отладки, которое слишком длинно для комментария:

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

Два абсолютных ключа к успешным динамически создаваемым элементам управления
1) Создание их вправильное время в течение жизненного цикла страницы
2) Повторное создание иерархии элементов EXACT SAME (включая идентификаторы) при обратной передаче

0 голосов
/ 06 июля 2011

Причиной такого поведения была не сама система управления сервером, а связанная с Sitecore. Чтобы Sitecore не мешал обратным передачам управления сервером, необходимо добавить запись в разделе typesThatShouldNotBeExpanded в файле 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>
0 голосов
/ 13 мая 2011

Чтобы получить правильное дерево элементов управления, переопределите свойство Controls и вызовите EnsureChildControls, а также вызовите EnsureChildControls, а не CreateChildControls внутри PagerLinkCommand.

    /// <summary>
    /// Gets controls.
    /// </summary>
    public override ControlCollection Controls
    {
        get
        {
            EnsureChildControls();
            return base.Controls;
        }
    }

    /// <summary>
    /// Create child controls.
    /// </summary>
    protected override void CreateChildControls()
    {
        this.Controls.Clear();
        //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());
      EnsureChildControls();
    }        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...