带有多个中继器的ASP.NET MultiView

时间:2012-09-14 15:20:45

标签: asp.net repeater multiview

我有问题,我需要你的意见。我有一个带MultiView的控件,每个视图对于控件的输出都是不同的渲染,它将是大约10个不同的视图。在每个视图中我将有一个重复几行的转发器,这个转发器对于所有视图都是相同的,因为MultiView只允许在任何时间显示1个视图,我虽然让转发器具有相同的ID ,所以我不必制作10个绑定并使用完全相同的代码创建10个OnItemDataBound事件,但是ASP.NET不允许我使用相同ID的转发器(它应该比这个案例更聪明) )。我正在使用框架的C#和v4。

这是MultiView代码:

<asp:MultiView id="MultiView" runat="server">

    <asp:View id="h400" runat="server">
        <div class="latest_Wide">
            <h3>Wide</h3>
            <asp:Repeater id="rptLatest" runat="server" OnItemDataBound="rptLatest_OnItemDataBound">
                <ItemTemplate>
                    <p>&bull; <asp:Literal id="litPostTitle1" runat="server" /></p>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </asp:View>

    <asp:View id="h200" runat="server">
        <div class="latest_Narrow">
            <h3>Narrow</h3>
            <asp:Repeater id="rptLatest" runat="server" OnItemDataBound="rptLatest_OnItemDataBound">
                <ItemTemplate>
                    <p>&bull; <asp:Literal id="litPostTitle2" runat="server" /></p>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </asp:View>

...

</asp:MultiView>

我该如何解决这个问题。请记住,我不想制作10个转发器绑定,并且有10个OnItemDataBound事件具有完全相同的代码,因为您建议为转发器提供不同的ID。

2 个答案:

答案 0 :(得分:0)

这不太漂亮......但是:

假设你的ASCX:

<asp:MultiView id="mvPostDisplay" runat="server">

    <asp:View id="h400" runat="server">
        <div class="latest_Wide">
            <h3>Wide</h3>
            <asp:Repeater runat="server" OnItemDataBound="rptLatest_OnItemDataBound">
                <ItemTemplate>
                    <p>&bull; <asp:Literal id="litPostTitle1" runat="server" /></p>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </asp:View>

    <asp:View id="h200" runat="server">
        <div class="latest_Narrow">
            <h3>Narrow</h3>
            <asp:Repeater runat="server" OnItemDataBound="rptLatest_OnItemDataBound">
                <ItemTemplate>
                    <p>&bull; <asp:Literal id="litPostTitle2" runat="server" /></p>
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </asp:View>

...

</asp:MultiView>

在你的代码隐藏中:

    private void DataBindRepeater()
    {
        View activeView = this.mvPostDisplay.GetActiveView();
        Repeater myRepeater = this.FindRepeater(activeView);
        if (myRepeater != null)
        {
            myRepeater.DataSource = this.GetDataSourceFormSomewhere();
            myRepeater.DataBind();
        }
    }

    private Repeater FindRepeater(Control container)
    {
        if (container is Repeater)
        {
            return container as Repeater;
        }
        else
        {
            foreach (Control c in container.Controls)
            {
                Repeater retVal = this.FindRepeater(c);
                if (retVal != null)
                {
                    return retVal;
                }
            }

            return null;
        }
    }

在确定适当的视图后,只需致电DataBindRepeater即可。请注意,rptLatest将不会被设置,因此您需要使用senderFindRepeater或可能不那么hackish的东西在您的处理程序中获取对您的转发器的引用。

答案 1 :(得分:0)

您是否考虑过让转发器成为用户控制?这样,您可以在用户控件中使用所有转发器绑定代码。每个视图都有自己的usercontrol实例。

这是你愿意接受的方向吗?