我在一个填充用户控件的页面上有一个Repeater。用户控件中有一个ImageButton。当我单击ImageButton来调用用户控件后面代码中的Click函数时,它不会触发Click函数抛出此错误:
505 | error | 500 |无效的回发或回调参数。使用配置或<%@ Page EnableEventValidation =" true"启用事件验证。 %GT;在一个页面中。出于安全考虑,此功能可验证回发或回调事件的参数是否来自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。|
我如何使用ClientScriptManager.RegisterForEventValidation来处理用户控件中ImageButton上的PostBack?
[Page.aspx]
<asp:ScriptManager runat="server" ID="ScriptManager1">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" ChildrenAsTriggers="false" runat="server">
<ContentTemplate>
<some:control ID="SomeControl" runat="server" />
<asp:Repeater ID="Repeater" OnItemDataBound="Repeater_ItemDataBound" runat="server">
<ItemTemplate>
<asp:UpdatePanel ID="UpdatePanel2" UpdateMode="Conditional" ChildrenAsTriggers="false" runat="server">
<ContentTemplate>
<user:control ID="UserControl" runat="server" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="UserControl" />
</Triggers>
</asp:UpdatePanel>
</ItemTemplate>
</asp:Repeater>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="SomeControl" />
</Triggers>
</asp:UpdatePanel>
[Page.aspx.cs]
protected void Page_Load(object sender, EventArgs e)
{
Repeater.DataSource = someList;
Repeater.DataBind();
}
protected void Repeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
if ((e.Item.ItemType == ListItemType.AlternatingItem) || (e.Item.ItemType == ListItemType.Item))
{
UserControl uc = (UserControl)e.Item.FindControl("UserControl");
uc.SetEverything();
}
}
[UserControl.ascx]
<asp:ImageButton ID="imgBtn" runat="server" OnClick="ImageButton_Click" ImageUrl="image.png" />
[UserControl.ascx.cs]
protected void ImageButton_Click(Object sender, EventArgs e)
{
// DO SOMETHING
}
答案 0 :(得分:1)
我刚刚回答了我的问题。我最后检查了更新面板上触发的事件类型。如果是ImageButton单击,则不要在转发器上执行数据绑定。
[Page.aspx.cs]
protected void Page_Load(object sender, EventArgs e)
{
if (!ScriptManager1.AsyncPostBackSourceElementID.EndsWith("imgBtn"))
{
Repeater.DataSource = someList;
Repeater.DataBind();
}
}