按钮的转发器OnClick事件导致System.ArgumentException:无效的回发或回调参数

时间:2014-08-13 17:08:24

标签: c# asp.net

我目前正在使用转发器来制作按钮列表。每个按钮都有一个单击事件,它将从列表中删除转发器中的该项。但是,当我单击任何按钮时,我收到错误System.ArgumentException: Invalid postback or callback argument。我在看this answer。我不想禁用EnableEventValidation(这样做会带来安全风险)。对此有更好的解决方案吗?

错误:

2014-08-13 12:52:34.305 7276    ASP.support_createcustomer_autocamerainstall_aspx   Error   Exception for url=/AdminDotNet/Support/CreateCustomer/AutoCameraInstall.aspx
System.ArgumentException: Invalid postback or callback argument.  Event validation is enabled using <pages enableEventValidation="true"/> in configuration or <%@ Page EnableEventValidation="true" %> in a page.  For security purposes, this feature verifies that arguments to postback or callback events originate from the server control that originally rendered them.  If the data is valid and expected, use the ClientScriptManager.RegisterForEventValidation method in order to register the postback or callback data for validation.
   at System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument)
   at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)
   at System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

HTML:

<asp:UpdatePanel ID="panelCameraGroup" runat="server" UpdateMode="Conditional">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="locAddCameraButton" />
    </Triggers>

    <ContentTemplate>

        <div id="divMainContent" runat="server">

            <asp:Repeater ID="repeaterCameras" runat="server">
                <ItemTemplate>

                        <div>
                            <asp:Button ID="locRemoveCameraButton" runat="server"
                                OnClientClick="return clickRemoveCamera(this)" OnClick="RemoveCamera"
                                Text="Remove" meta:resourcekey="btnRemoveCamera"
                                data-camera-position='<%# Eval("Position") %>'></asp:Button>
                        </div>

                </ItemTemplate>
            </asp:Repeater>

        </div>
    </ContentTemplate>
</asp:UpdatePanel>

clickRemoveCamera只是一个空的JavaScript方法。 locAddCameraButton是用于添加到转发器列表的单个按钮。我已尝试删除AsyncPostBackTrigger并删除UpdateMode="Conditional"。仍然没有奏效。

C#:

protected void RemoveCamera(object sender, EventArgs e)
{
    if (sender == null)
        return;

    Button removeCameraButton = (Button)sender;
    string buttonClickPos = removeCameraButton.Attributes["data-camera-position"];
    System.Diagnostics.Debug.WriteLine("buttonClickPos = " + buttonClickPos);
    foreach (RepeaterCamera rc in repeaterCamerasList)
    {
        if(string.Equals(rc.Position.ToString(), buttonClickPos)){
            System.Diagnostics.Debug.WriteLine("Found camera in repeater");
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我明白了。在我Page_Load我更改了转发器。我应该只在!IsPostBack期间这样做(我不是)。所以我补充说它有效。