C# 绑定父中继器后在LoginView中丢失数据

C# 绑定父中继器后在LoginView中丢失数据,c#,asp.net,webforms,repeater,C#,Asp.net,Webforms,Repeater,我的ASP.NET 4.5站点中的一个转发器中嵌套了一个LoginView,我遇到了一些问题。当页面加载时,数据被正确绑定。但是,如果某个外部事件重新绑定了中继器,LoginView模板中的内容不会重新绑定。我已经尽可能地简化了我的代码,使其具有可重复性。运行此页面,然后单击“重新绑定数据”按钮。按钮标签消失。我如何让它们正确地重新绑定(例如:显示绑定到的数据项的文本)?我认为在中继器上调用DataBind()会重新绑定所有子控件,但我想不会。我尝试了两次不同的手动绑定迭代(没有一次成功),但更

我的ASP.NET 4.5站点中的一个转发器中嵌套了一个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;
            }
        }
    }
名称空间MyNamespace
{
公共部分类RepeaterTest:System.Web.UI.Page
{
列表=新列表()
{
新TestClass(“hi”),
新TestClass(“hello”),
新TestClass(“你好”),
新测试类(“hola”)
};
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{               
MyRepeater.DataSource=列表;
MyRepeater.DataBind();
}
}
受保护的未命名无效\u单击(对象发送者,事件参数e)
{
MyRepeater.DataSource=列表;
MyRepeater.DataBind();
}
}
公共类TestClass
{
公共字符串文本{get;set;}
公共测试类(字符串文本)
{
文本=文本;
}
}
}

嗨,梅森,我没能重现你的情景。对我来说,点击按钮后标签保持原样。这是VS2013中一个新的ASP.NET4.5WebForms项目。我还尝试在回发后通过用diff文本实例化新的列表集合来更改标签,这同样有效。尝试检查客户端错误、是否存在篡改viewstate的内容、尝试在VS 2013中关闭浏览器链接(如果适用)。我尝试了您在问题中添加的代码,在单击Repeater控件外的按钮后,我没有遇到数据绑定问题。在实际代码中单击Repeater控件外的按钮时,我怀疑您是否丢失了数据源中的数据。你能分享你面对这个问题的实际代码吗?这是因为组件是在Page_Init之后生成的。您应该去阅读有关ASP.NET页面生命周期的内容。请参阅此链接:解决方案是尝试在第页上构建控件_Init@MarcoAlves无论如何,我都不会构建控件,它们是在标记中声明的。我知道这一点。但是,相信我,他们是在页面初始化后绑定的。这就是你的问题。看看我发到美国的链接。