[英]Asp.NET Server Control Postback
我有一個想要創建的控件。 這是我要完成的一個簡單示例。
我希望控件包含一個按鈕。
Button b = new Button();
b.Text = "Test";
b.Click += new EventHandler(b_Click);
this.Controls.Add(b);
現在,控件呈現正常,按鈕顯示在頁面上。 我遇到的問題的核心是b_Click事件處理程序永遠不會被觸發。
protected void b_Click(object sender, EventArgs e)
{
throw new NotImplementedException();
}
這里的任何幫助將不勝感激。 我不想在這里使用用戶控件純粹是出於自私的原因,並希望將其完全封裝在一個DLL中。
提前致謝。
編輯**
namespace ClassLibrary1
{
[DefaultProperty("Text")]
[ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]
public class WebCustomControl1 : WebControl
{
protected override void CreateChildControls()
{
Button b = new Button();
b.ID = "button";
b.Text = "Click Me";
b.Click += new EventHandler(b_Click);
this.Controls.Add(b);
base.CreateChildControls();
}
protected void b_Click(object sender, EventArgs e)
{
this.Controls.Add(new LiteralControl("<p>Click!</p>"));
}
}
}
所以從評論中我試過這個。 最簡單的例子,仍然沒有去。 有什么東西我從根本上失蹤了嗎?
public class WebCustomControl1 : WebControl
需要
public class WebCustomControl1 : WebControl, INamingContainer
而已。 這就是使這個回發問題發揮作用所需要的一切。
覆蓋CreateChildControls方法並在該方法中創建/添加按鈕(並注冊處理程序)。
使用OnInit / OnLoad創建這樣的控件是不正確的,會導致行為不一致(例如您遇到的情況)。
編輯:您也可以嘗試設置button.ID,以便在每次回發時都是相同的,由於這個原因,凸起的事件可能沒有看到它。
請顯示您的控件類的定義。
您的控件是繼承自Control,WebControl還是CompositeControl。 嘗試繼承CompositeControl並查看是否有幫助。
因此,您的按鈕正確呈現到頁面並在用戶單擊時導致回發,但OnClick代碼永遠不會運行?
請記住,無論何時進行回發,您都要使用頁面類的全新實例。 回發過程的一部分正在運行用戶觸發的任何事件。 為此,asp.net處理器需要了解頁面生命周期中特定點的事件。 此時,您的按鈕必須已經在已注冊事件處理程序的頁面上 。 如果沒有發生這種情況,您的活動將不會觸發。 嘗試在頁面生命周期的早期移動按鈕創建。
這可能是在事件引發后很好地分配處理程序的情況。
處理控件時我的常見做法是:
在回發之前和回發之后檢查按鈕控件的標識符。 如果它不相同,它將無法工作。
如果需要,您可以自己覆蓋標識符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.