2011-02-03 29 views
0

我猜這可能與this有關,但不幸的是,在這種情況下解決方法似乎不起作用。自定義控件中的LinkBut​​ton不呈現標識(或者真的可以工作)

經過較大的實現不起作用掙扎後,我把它歸結爲最簡單的情況。這不起作用。

public class MyButton : Control 
    { 
     public MyButton() 
      : base() 
     { 
      LinkButton but = new LinkButton(); 
      but.CommandName = "test"; 
      but.CommandArgument = "test2"; 
      but.Text = "Click Here"; 
      Controls.Add(but); 
     } 
    } 

什麼渲染是:

<a href="javascript:__doPostBack('ctl00$ctl11$ctl07','')">Click Here</a> 

這裏有兩個主要問題。首先,沒有身份證。它應該有標籤id='ctl00$ctl11$ctl07'。所以即使它會發布,事件也不會被捕獲。

其次,它忽略了CommandName和CommandArgument,無論如何它應該呈現__doPostBackWithOptions

我是非常愚蠢的,只是忽略了一些明顯的東西,或者這是ASP.NET中的一個巨大的錯誤?

我已經在ControlWebControl內部提供了很多其他控件,並且從來沒有遇到過任何問題,所以它肯定與簡單性有關,而不是複雜性。

如果有人能幫助我解決這個問題,將不勝感激。

回答

0

那是因爲你應該實現INamingContainer Interface

+0

沒有區別。也不應該。 INamingContainer只需要確保容器中用戶分配的ID的唯一性。這不是一箇中繼器,也不會分配任何自己的ID。 – 2011-02-03 18:45:15

+0

讓我改述一下:它確實有所作爲,ID是在我用於控件的ID的上下文中,而不是頁面的上下文中。但它仍然不起作用,它不會呈現它自己的ID,也不會呈現正確的回發javascript。我確實嘗試過(其中大約一百萬件):) – 2011-02-03 18:53:47

0

設置你的按鈕的ID屬性。

but.ID = "MyLinkButtonID"; 
but.Command += new CommandEventHandler(EVENTHANDLER); 

如果按鈕始終是類的成員,則將該按鈕添加爲成員,並將其添加到OnInit事件的Controls集合中。

忘記爲命令事件添加事件處理程序。

0

ARGH!我踢自己,答案實際上是一個命名容器問題。這是我所能做的所有事情之一就是關注一些細節,這實際上並不是問題。

我的自定義控件被另一個控件發射到第三個控件中。但是可以有幾個「第三控制」的例子。 (總的來說,我做了一些讓我可以在表單前後放置一個表單控件按鈕的副本,主控件確定給定表單發出哪個按鈕)。

所以「第三控制」不是命名容器。那就是殺了它。但是我從來沒有發現任何關於ID衝突的錯誤,它只是不起作用。