2010-02-19 72 views
2

我有我自己的Control1,它是作为子控件动态添加到Control2的,它在Control2的CreateChildControls()中实现INamingContainer。ASP.NET:如何为我自己的控件处理回发事件?

Control1本身实现IPostBackEventHandler。但RaisePostBackEvent()方法永远不会在Control1上调用,尽管我使用JavaScript调用回发方法。

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

我错过了什么?

什么可能导致此问题?

UPDATE:控制1总是产生完全相同的方式和控制2

它看起来像这样在控制2分配完全相同的ID:

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

UPDATE2: 控制1:

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

如果我加行

Page.RegisterRequiresRaiseEvent(c); 

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

UPDATE3:

在JavaScript上的一些onClick事件我做到以下几点:

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

其中Control1.UniqueID是当然的渲染过程中取代与真正的UNIQUEID。我查过了,这个脚本正在被调用。

+0

@Artem,请说明您是如何注册回发脚本的?这是你的控制的一般结构。 – 2010-02-19 09:13:20

+0

增加JavaScript的说明 – Artem 2010-02-19 19:35:00

回答

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

从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(); 
    } 

} 
+0

我没有输入,它只是一个对onclick()事件有反应的控件。 – Artem 2010-02-19 19:35:48

+0

对不起。我已更新了我的帖子,查看了它。 – 2010-02-20 05:55:16

0

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

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

+0

我回答你的问题吗? – Artem 2010-02-19 19:36:32

相关问题