ASP.NET: как обрабатывать события обратной передачи для моего собственного контроля?

У меня есть собственный Control1, который динамически добавляется как дочерний элемент управления к Control2, который реализует INamingContainer в CreateChildControls () элемента control2.

Сам Control1 реализует IPostBackEventHandler. Но метод RaisePostBackEvent () никогда не вызывается на Control1, несмотря на то, что я вызываю метод обратной передачи из JavaScript.

И да, есть другие элементы управления, которые реализуют интерфейс IPostBackEventHandler на странице.

Что я пропустил?

Что могло вызвать проблему?

ОБНОВЛЕНИЕ: Control1 всегда создается точно так же, и ему назначается точно такой же идентификатор в Control2

в Control2 это выглядит так:

protected override void CreateChildControls()
{
  if(!this.DesignMode)
  {
    Control1 c = new Control1();
    c.ID = "FIXED_ID";
  }
  base.CreateChildControls();
}

ОБНОВЛЕНИЕ2: Control1:

public class Control1: Control, IPostBackEventHandler
{
...
    protected virtual void RaisePostBackEvent(string eventArgument)
    {
              if(!String.IsNullOrEmpty(eventArgument))
              {
                  // Some other code
              }
    }       
}

если я добавлю строку

Page.RegisterRequiresRaiseEvent(c);

В CreateChildControls () в Control2 этот метод вызывается, но всегда с нулевым аргументом eventArgument.

ОБНОВЛЕНИЕ 3:

В JavaScript в некоторых событиях onClick я делаю следующее:

__doPostBack(Control1.UniqueID,'commandId=MyCommand');

где Control1.UniqueID, конечно, заменяется реальным uniqueID во время рендеринга. Проверил, вызывается этот скрипт.


person Artem    schedule 19.02.2010    source источник
comment
@Artem, покажите, пожалуйста, как регистрировали скрипт постбека? Это общая структура вашего контроля.   -  person Mehdi Golchin    schedule 19.02.2010


Ответы (2)


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

public class TestControl2 : CompositeControl
{

    protected override void CreateChildControls()
    {
        base.CreateChildControls();

        if (!DesignMode)
            this.Controls.Add(new TestControl());
    }

}

public class TestControl : WebControl, IPostBackEventHandler
{

    public TestControl() : base(HtmlTextWriterTag.Input) { }

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);

        writer.AddAttribute(HtmlTextWriterAttribute.Type, "button");
        writer.AddAttribute(HtmlTextWriterAttribute.Name, base.UniqueID);
        writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, null));
        writer.AddAttribute(HtmlTextWriterAttribute.Value, "Submit Query");
    }

    void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
    {
        // Raise post back event
    }

}

Изменить

  1. Почему вы создаете сценарий обратной отправки неконтролируемо и вручную? Вы должны использовать метод Page.ClientScript.GetPostBackEventReference. Он генерирует и включает некоторые необходимые встроенные и встроенные скрипты на страницу.

  2. Почему вы выводите свой класс из Control? Это хорошо для тех элементов управления, у которых нет пользовательского интерфейса.

Из MSDN

Это основной класс, производный от которого вы разрабатываете настраиваемые серверные элементы управления ASP.NET. Control не имеет каких-либо специфических функций пользовательского интерфейса (UI). Если вы создаете элемент управления, не имеющий пользовательского интерфейса, или объединяете другие элементы управления, отображающие собственный пользовательский интерфейс, наследуйте от Control. Если вы создаете элемент управления, у которого есть пользовательский интерфейс, производный от WebControl или любого элемента управления в пространстве имен System.Web.UI.WebControls, который обеспечивает подходящую отправную точку для вашего настраиваемого элемента управления.

Вы должны получить управление от класса WebControl следующим образом.

public class TestCtl : WebControl, IPostBackEventHandler
{

    protected override void AddAttributesToRender(HtmlTextWriter writer)
    {
        base.AddAttributesToRender(writer);
        // Add onclick event.
        writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, "Arguments"));
    }

    void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
    {
        throw new NotImplementedException();
    }

}
person Mehdi Golchin    schedule 19.02.2010
comment
У меня нет ввода, это просто элемент управления, который реагирует на какое-то событие onclick (). - person Artem; 19.02.2010

Я собираюсь предположить, что проблема заключается в «динамически добавляемом в качестве дочернего элемента управления к Control2», но без кода это довольно сложно диагностировать.

Когда в течение жизненного цикла страницы вы добавляете ее динамически? Вы воссоздаете динамический элемент управления таким же образом, с тем же идентификатором, после обратной передачи?

person womp    schedule 19.02.2010