单击在asp:Repeater中呈现的ascx控件中的按钮时丢失值

时间:2014-03-18 11:25:15

标签: c# asp.net repeater

我创建了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为空 我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

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

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

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

修改

Here's a good picture showing the entire WebForms page lifecycle

如你所见

ProcessPostData事件被称为 AFTER Load事件。

所以你想在处理完PostData之后绑定你的Repeater

这可以在PreRender

上完成

答案 1 :(得分:0)

问题不在于您在错误的位置调用数据绑定,但很可能是用户控件没有正确地在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
}