ASP.NET:如何为我自己的控件处理回发事件?

时间:2010-02-19 07:00:57

标签: asp.net asp.net-ajax postback custom-controls

我有自己的Control1,它作为子控件动态添加到Control2,它在control2的CreateChildControls()中实现了INamingContainer。

Control1本身实现了IPostBackEventHandler。但是从不在Control1上调用RaisePostBackEvent()方法,尽管我从JavaScript调用了回发方法。

是的,还有其他控件在页面上实现了IPostBackEventHandler接口。

我错过了什么?

什么可能导致问题?

更新:Control1始终以完全相同的方式创建,并在Control2中分配完全相同的ID

在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);

在Control2中的CreateChildControls()中,正在调用此方法但始终使用null eventArgument。

UPDATE3:

在一些onClick事件的JavaScript中,我执行以下操作:

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

其中Control1.UniqueID当然在渲染过程中用真实的uniqueID替换。我查了一下,这个脚本正在调用。

2 个答案:

答案 0 :(得分:3)

您能告诉我们第一个控件的源代码吗?无论如何,有一个简单的例子。

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派生您的课程?这对那些没有任何用户界面的控件很有用。

  3. 来自MSDN

      

    这是你的主要课程   源于您开发自定义的时间   ASP.NET服务器控件。控制呢   没有任何用户界面(UI)   具体功能。如果你是   创作一个没有的控件   UI,或组合其他控件   渲染自己的UI,派生自   控制。如果你正在创作一个   导出具有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();
        }
    
    }
    

答案 1 :(得分:0)

我猜这是“动态添加为Control2的子控件”这就是问题,但是没有任何代码就很难诊断出来。

在页面生命周期中,您是否动态添加它?在回发后,您是否以完全相同的方式重新创建动态控件,具有相同的ID?