当在asp:Repeater中渲染的控件中单击按钮时失去值

本文关键字:按钮 单击 失去 控件 asp Repeater 当在 | 更新日期: 2023-09-27 17:50:49

我创建了一个asp:Repeater,我用.ascx控件填充:

protected void Page_Load(object sender, EventArgs e)
{
    Repeater1.DataSource = listOfData;
    Repeater1.DataBind();            
}

在这一页我有:

<uc:Product runat="server"                                             
    ImportantData='<% #Eval("ImportantData") %>'                                               
    id="DetailPanel1" />

Product.ascx.cs里面我有:

public int ImportantData{ get; set; }
protected void Page_Load(object sender, EventArgs e)
{
}

Product.ascx上我有:

<asp:ImageButton ID="btn_Ok" runat="server" 
     onclick="btn_Ok_Click"  
     ImageUrl="~/image.png" />

问题是,当我点击图像按钮,我得到错误:

A critical error has occurred. Invalid postback or callback argument. Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page...

我已经尝试将第一个代码更改为:

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        Repeater1.DataSource = listOfData;
        Repeater1.DataBind();            
    }
    // Repeater1.DataBind(); // and tried to put DataBind() here
}

但是当我点击图像按钮时,ImportantData是空的。
我哪里做错了?

当在asp:Repeater中渲染的控件中单击按钮时失去值

PageLoad发生在您的回发事件之前,将您的事件更改为PreRender:

protected void Page_PreRender(object sender, EventArgs e)
{
    Repeater1.DataSource = listOfData;
    Repeater1.DataBind();            
}

这将在回发后绑定您的中继器并保持您的回发值。

编辑:

这张图片很好地展示了整个WebForms页面的生命周期:

如你所见

ProcessPostData事件称为AFTER Load事件。

所以你想在PostData被处理后绑定Repeater

可以在PreRender

问题不在于您在错误的地方调用了数据绑定,而很可能是用户控件没有正确地将数据保存在viewstate中。看起来您正在使用自定义控件。在这种情况下,您可以在用户控件上创建一个属性,从视图状态读取数据。下面是一个例子:

Public Property ImportantData() As Int32
    Get
        Return ViewState("_ImportantData")
    End Get
    Set(ByVal value As Int32)
        ViewState("_ImportantData") = value
    End Set
End Property

这将允许您的数据持久化,并在回发时显示必要的数据。

,这样做是正确的,因此它只加载初始加载。

protected void Page_Load(object sender, EventArgs e)
{
    if(!Page.IsPostBack)
    {
        Repeater1.DataSource = listOfData;
        Repeater1.DataBind();            
    }
    // Repeater1.DataBind(); // and tried to put DataBind() here
}