2009-10-16 80 views
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> 

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中的内容被整个用户控件之后,而不是转发器中呈现。

任何人都可以指出我可能会错在哪里和/或指向一个更好的方向吗?

+0

难道是有生命周期呢?控件中的Page_Init将在页面的Page_Init之前运行 - 是否设置了myRepeater.ItemTemplate? – 2009-10-16 13:34:46

+0

这不是,我刚刚发现了确切的问题。 Page_Init中的this.ItemTemplate为null。实际上,它似乎总是空的。我不确定在哪里可以挑选它以便使用它,因为它不会被渲染。 – 2009-10-16 13:37:05

回答

4

你有解析并坚持错误的方式。

你想

[ParseChildren(true)] 
[PersistChildren(false)] 
+0

这是多少......是的......就是这样。谢谢! – 2009-10-16 13:58:34