ASP.NET: Как обрабатывать события обратной передачи для моего собственного контроля? - PullRequest
2 голосов
/ 19 февраля 2010

У меня есть собственный 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();
}

UPDATE2: 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.

UPDATE3:

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

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

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

Ответы [ 2 ]

3 голосов
/ 19 февраля 2010

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

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.Элемент управления не имеет каких-либо специфических функций пользовательского интерфейса (UI).Если вы создаете элемент управления, который не имеет пользовательского интерфейса или объединяет другие элементы управления, которые отображают свой собственный пользовательский интерфейс, производные от элемента управления.Если вы создаете элемент управления с пользовательским интерфейсом, производным от 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();
    }

}
0 голосов
/ 19 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...