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