当在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
是空的。
我哪里做错了?
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
}