【发布时间】:2011-08-25 00:51:27
【问题描述】:
我正在开发一个继承 CompositeControl 类的 Asp.NET (.NET 3.5) 中的自定义服务器控件。在我的控件中,我重写了CreateChildControls() 方法来生成html 和Asp.NET 服务器控件的混合。添加的一些 Asp.NET 控件是LinkButtons(每个都将其Command 事件处理程序设置为我控件中的方法)。我发现第一次单击这些链接按钮中的一个时,会触发回发并且正确触发事件处理程序方法。在此事件处理程序中,显式调用 CreateChildControls() 方法以重新生成控件以响应回发。然后我发现LinkButtons 回发的后续点击无法引发事件处理程序方法。
我认为我在回发时处理控件重新生成的方式一定有问题,但我不知道该怎么做 - 我知道在第一次回发时 CreateChildControls() 是调用了两次,这可能并不理想,但由于在引发任何事件之前调用了 CreateChildControls,因此我看不到解决方法。
我的控件类的简化版本如下所示:
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() - 尝试删除它。
标签: c# asp.net postback sitecore custom-server-controls