我在繼承CompositeControl類的Asp.NET(.NET 3.5)中開發自定義服務器控件。在我的控制之內,我重寫了CreateChildControls()
方法來生成html和Asp.NET服務器控件的混合。一些添加的Asp.NET控件是LinkButton
s(每個控件都有它們的Command
事件處理程序設置爲一個方法)。我發現,第一次點擊這些LinkButton中的一個時,會觸發一個回傳,並正確觸發事件處理程序方法。在此事件處理程序方法內部,顯式調用CreateChildControls()以響應回發重新生成控件。然後我發現後續點擊LinkButton
的回發無法啓動事件處理程序方法。我認爲我處理回發控件再生的方式必須是錯誤的,但我不知道該怎麼辦 - 我意識到這一事實,在第一次回發CreateChildControls()被調用兩次,這可能不是理想的,但由於CreateChildControls在任何事件引發之前被調用,所以我沒有看到解決方法。Asp.NET自定義服務器控件事件處理程序不在第二個回發上觸發
我的控制類的簡化版本如下:
public class SearchResults : CompositeControl
{
private int PageIndex = 0;
protected override void CreateChildControls()
{
//do stuff here e.g.
LinkButton prevLink = new LinkButton();
prevLink.Text = "< Prev";
prevLink.CommandArgument = (PageIndex - 1).ToString();
prevLink.Command += new CommandEventHandler(PagerLinkCommand);
this.Controls.Add(prevLink);
}
protected void PagerLinkCommand(object sender, CommandEventArgs e)
{
PageIndex = int.Parse(e.CommandArgument.ToString());
CreateChildControls();
}
}
編輯 該控件在Sitecore的網站使用,我已經忘了這裏是由事實造成的問題登記在web.config文件中使用<typesThatShouldNotBeExpanded>
條目控制類型。此條目用於防止服務器控件使其事件被Sitecore弄亂 - 這可能會導致標準服務器控件(如ListView,GridView和Repeater等)出現類似問題。我的web.config被修改爲如下所示:
<typesThatShouldNotBeExpanded>
<type>System.Web.UI.WebControls.Repeater</type>
<type>System.Web.UI.WebControls.DataList</type>
<type>System.Web.UI.WebControls.GridView</type>
<type>MyNamespace.MyCustomControl</type> <!-- This is the bit I added -->
</typesThatShouldNotBeExpanded>
基類應爲您調用CreateChildControls() - 嘗試刪除它。 – IrishChieftain 2011-05-13 15:11:29