C# 具有多个模板的ASP中继器控件

C# 具有多个模板的ASP中继器控件,c#,asp.net,razor,C#,Asp.net,Razor,如果选择的模板是基于项目类型的,如何使具有多个模板的repeater控件 这就是我目前拥有的: 我的复读班: [ToolboxData("<{0}:LifestreamRepeater runat=server>")] public class LifestreamRepeater : Repeater { [PersistenceMode(PersistenceMode.InnerProperty)] public ITemplate TwitterTemplat

如果选择的模板是基于项目类型的,如何使具有多个模板的repeater控件

这就是我目前拥有的:

我的复读班:

[ToolboxData("<{0}:LifestreamRepeater runat=server>")]
public class LifestreamRepeater : Repeater
{

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate TwitterTemplate {get; set;}


    protected override void OnDataBinding(EventArgs e)
    {
        //base.OnDataBinding(e);
        foreach (var item in (IEnumerable<LifestreamItem>)this.DataSource)
        {
            if (item is LifestreamTwitterItem)
            {
                LifestreamRepeaterItem ri = new LifestreamRepeaterItem(item);
                TwitterTemplate.InstantiateIn(item);
            }
            else
            {
                ItemTemplate.InstantiateIn(item);
            }
        }

    }
}
[ToolboxData(“”)
公共类LifestreamRepeater:中继器
{
[PersistenceMode(PersistenceMode.InnerProperty)]
公共ITemplate TwitterTemplate{get;set;}
受保护的覆盖无效OnDataBinding(EventArgs e)
{
//碱基结合(e);
foreach(this.DataSource(IEnumerable)中的变量项)
{
if(项目为LifestreamWitterItem)
{
LifestreamRepeaterItem ri=新的LifestreamRepeaterItem(项目);
TwitterTemplate.InstanceEIN(项目);
}
其他的
{
ItemTemplate.instantialein(item);
}
}
}
}
前端:

        <lfs:LifestreamRepeater runat="server" ID="repeater1">
            <TwitterTemplate>
                <div class="Lifestream Twitter Item">
                    <h4> <%# DataBinder.Eval(Container.DataItem, "Title")%> </h4>
                    <p>  <%# DataBinder.Eval(Container.DataItem, "Body")%> </p>
                </div>
            </TwitterTemplate>
            <ItemTemplate>
                <div class="Lifestream Item">
                    <h2> <%# DataBinder.Eval(Container.DataItem, "Title")%> </h2>
                    <p>  <%# DataBinder.Eval(Container.DataItem, "Body")%> </p>
                </div>
            </ItemTemplate>
        </lfs:LifestreamRepeater>


然后我将repeater控件绑定到LifestreamItem的IEnumerable,它是多个不同社交网络帖子类型的基类,因此可能有TwitterLifestreamItem和VimeoLifestreamItem,我希望repeater选择不同的模板,具有不同的可能值,取决于数据项。

我认为ASP.NET中没有任何内置内容允许这样做,但您可以这样做:

<asp:Repeater ID="myRepeater" runat="server" OnItemDataBound="myRepeater_ItemDataBound">
    <ItemTemplate>
        <asp:PlaceHolder ID="twitterTemplate" Visible="false" runat="server">
             <asp:Literal ID="fooTwitterControl" runat="server" />
        </asp:PlaceHolder>

        <asp:PlaceHolder ID="itemTemplate" Visible="false" runat="server">
             <asp:Literal ID="fooItemControl" runat="server" />
        </asp:PlaceHolder>
    </ItemTemplate>
</asp:Repeater>

本质上,
ItemTemplates
将成为占位符,并根据您正在迭代的类型启用/禁用。

解决方案似乎是覆盖数据绑定方法,如下所示:

    public override void DataBind()
    {
        foreach (var item in (IEnumerable<LifestreamItem>)this.DataSource)
        {
            if (item is LifestreamTwitterItem)
            {
                TwitterTemplate.InstantiateIn(item); // instantiate inside the item which is also a control.
            }
            else
            {
                ItemTemplate.InstantiateIn(item);
            }
            item.DataBind(); // bind the item
            Controls.Add(item); // add the item to the repeater
        }
    }
public覆盖无效数据绑定()
{
foreach(this.DataSource(IEnumerable)中的变量项)
{
if(项目为LifestreamWitterItem)
{
TwitterTemplate.InstanceIn(item);//在也是控件的item内实例化。
}
其他的
{
ItemTemplate.instantialein(item);
}
item.DataBind();//绑定项
Controls.Add(item);//将该项添加到中继器
}
}

虽然这样做可行,但我真的希望设计师能轻松直接地使用它。我可以做一个自定义控件来做这个吗?@Steve Yep,一个自定义控件相对来说比较容易创建。只需从
repeater
类继承类似的问题:这是一个有用的链接,显示所有必需的模板属性(否则并非所有功能都有效,例如
Container.ItemIndex
):
    public override void DataBind()
    {
        foreach (var item in (IEnumerable<LifestreamItem>)this.DataSource)
        {
            if (item is LifestreamTwitterItem)
            {
                TwitterTemplate.InstantiateIn(item); // instantiate inside the item which is also a control.
            }
            else
            {
                ItemTemplate.InstantiateIn(item);
            }
            item.DataBind(); // bind the item
            Controls.Add(item); // add the item to the repeater
        }
    }