绑定父Repeater后在LoginView中丢失数据

时间:2014-07-15 03:15:44

标签: c# asp.net webforms repeater

我在使用嵌套在我的ASP.NET 4.5站点的Repeater中的LoginView时遇到了一些麻烦。页面加载时,数据会正确绑定。但是,如果某些外部事件重新绑定转发器,则LoginView模板内的内容不会重新绑定。我尽可能地简化了我的代码以使其可重复。运行此页面,然后单击“重新绑定数据”按钮。按钮标签消失。如何正确重新绑定(例如:显示它所绑定的数据项的文本)?我认为在转发器上调用DataBind()会重新绑定所有子控件,但我猜不会。我尝试了几次不同的手动绑定迭代(没有工作),但更喜欢干净的实现。

RepeaterTest.aspx

<%@ Import Namespace="MyNamespace" %>

<asp:Repeater runat="server" ID="MyRepeater">
    <ItemTemplate>
        <asp:LoginView runat="server">
            <LoggedInTemplate>
                 <asp:Button runat="server" Text='<%# ((Container.Parent as RepeaterItem).DataItem as TestClass).Text %>' /><br />
            </LoggedInTemplate>
            <AnonymousTemplate>
                <asp:Button runat="server" Text='<%# ((Container.Parent as RepeaterItem).DataItem as TestClass).Text %>' /><br />
            </AnonymousTemplate>
        </asp:LoginView>
    </ItemTemplate>
</asp:Repeater>
<asp:Button runat="server" Text="Rebind Data" OnClick="Unnamed_Click" />

RepeaterTest.aspx.cs

namespace MyNamespace
    {
    public partial class RepeaterTest : System.Web.UI.Page
        {
        List<TestClass> list = new List<TestClass>()
                {
                new TestClass("hi"),
                new TestClass("hello"),
                new TestClass("bonjour"),
                new TestClass("hola")
                };

        protected void Page_Load(object sender, EventArgs e)
            {
            if (!IsPostBack)
                {               
                MyRepeater.DataSource = list;
                MyRepeater.DataBind();
                }
            }

        protected void Unnamed_Click(object sender, EventArgs e)
            {
            MyRepeater.DataSource = list;
            MyRepeater.DataBind();
            }
        }
    public class TestClass
        {
        public string Text { get; set; }
        public TestClass(string text)
            {
            Text = text;
            }
        }
    }

0 个答案:

没有答案