我在继承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