UserControl中包含的子控件传递到UserControl中的Repeater中。

4
我正在尝试实现类似以下内容的功能...
用户控件(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>

使用页面对象的ItemTemplate作为UserControl中Repeater的ItemTemplate。

这样做的原因是我们的应用程序中使用了许多Repeater,每个Repeater和一些相关按钮执行类似的代码。我希望将所有代码都放在一个地方,让开发人员可以使用我们的自定义Repeater控件,而不必每次都在每个页面创建代码。

我以前在WebControl中使用RenderContents方法创建Repeater控件时也做过类似的事情,并且一切都按照我的期望工作。

我想要使用UserControl的原因是,在不同系统之间可能需要进行许多样式/布局类型的更改,这将更容易通过直接编辑UserControl的html/asp实现。

目前,我的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的内容在整个UserControl之后渲染,而不是在重复器内部。
有人可以指出我可能错了的地方和/或指引我更好的方向吗?

可能与生命周期有关吗?控件中的Page_Init将在页面的Page_Init之前运行 - 是否设置了myRepeater.ItemTemplate? - Graham Clark
这不是问题,我刚刚发现了这个确切的问题。在Page_Init中,this.ItemTemplate为空。实际上,它似乎总是为空。我不确定在哪里可以提取它以便使用,因为它还没有被呈现。 - Robin Day
1个回答

4
你把解析和持久化的顺序弄反了。
你需要:
[ParseChildren(true)]
[PersistChildren(false)]

真是个蠢货... 是的... 就是那个。谢谢! - Robin Day

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接