我试图实现沿东西线内传递到一个中继子控件...用户控件与用户控件
用户控件(MyRepeater)
<p>Control Start</p>
<asp:Repeater id="myRepeater" runat="server" />
<p>Control End</p>
页
<p>Page Start</p>
<uc1:MyRepeater ID="MyRepeater1" runat="server">
<ItemTemplate>
<p>Page Item Template</p>
</ItemTemplate>
</uc1:MyRepeater>
<p>Page End</p>
Page对象中的ItemTemplate将用作UserControl中Repeater的ItemTemplate。
原因是我们在整个应用程序中使用了许多中继器,每个中继器和一些相应的按钮执行一些类似的代码。我希望将这些代码保存在一个地方,以便开发人员可以使用我们的自定义Repeater控件,而不必在每次需要时在每个页面中创建代码。
我在过去使用WebControl在Repeater控件的RenderContents方法内创建了一个Repeater控件,并且所有工作都如我所料。
我想使用UserControl的原因是因为可能需要在系统之间进行一些样式/布局类型更改,所以这将更容易作为可以编辑html/asp的UserControl直。
目前我UserControl的代码看起来像这样。
[ParseChildren(false)]
[PersistChildren(true)]
public partial class MyRepeater : System.Web.UI.UserControl, INamingContainer
{
protected void Page_Init(object sender, EventArgs e)
{
myRepeater.ItemTemplate = this.ItemTemplate;
}
protected void Page_Load(object sender, EventArgs e)
{
//Temporary bind for testing
myRepeater.DataSource = Enumerable.Range(1, 5);
myRepeater.DataBind();
}
[DefaultValue("")]
[Browsable(false)]
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateContainer(typeof(RepeaterItem))]
public virtual ITemplate ItemTemplate { get; set; }
}
简言之,它只是不工作...页面ItemTemplate中的内容被整个用户控件之后,而不是转发器中呈现。
任何人都可以指出我可能会错在哪里和/或指向一个更好的方向吗?
难道是有生命周期呢?控件中的Page_Init将在页面的Page_Init之前运行 - 是否设置了myRepeater.ItemTemplate? – 2009-10-16 13:34:46
这不是,我刚刚发现了确切的问题。 Page_Init中的this.ItemTemplate为null。实际上,它似乎总是空的。我不确定在哪里可以挑选它以便使用它,因为它不会被渲染。 – 2009-10-16 13:37:05