2010-02-19 52 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

相關問題