【问题标题】:Invalid postback or callback argument. Event validation is enabled using '<pages enableEventValidation="true"/>'无效的回发或回调参数。使用 '<pages enableEventValidation="true"/>' 启用事件验证
【发布时间】:2010-09-18 17:49:10
【问题描述】:

当我从客户端发回页面时,我收到以下错误。我有 JavaScript 代码可以在客户端修改 asp:ListBox。

我们如何解决这个问题?

错误详情如下:

Server Error in '/XXX' Application.

--------------------------------------------------------------------------------
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.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: 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.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[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.]
   System.Web.UI.ClientScriptManager.ValidateEvent(String uniqueId, String argument) +2132728
   System.Web.UI.Control.ValidateEvent(String uniqueID, String eventArgument) +108
   System.Web.UI.WebControls.ListBox.LoadPostData(String postDataKey, NameValueCollection postCollection) +274
   System.Web.UI.WebControls.ListBox.System.Web.UI.IPostBackDataHandler.LoadPostData(String postDataKey, NameValueCollection postCollection) +11
   System.Web.UI.Page.ProcessPostData(NameValueCollection postData, Boolean fBeforeLoad) +353
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1194

--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:2.0.50727.1433; ASP.NET Version:2.0.50727.1433

【问题讨论】:

  • 不要在 page_load 事件中执行数据绑定。

标签: .net asp.net .net-2.0 postback argumentexception


【解决方案1】:

您的 Page_Load 事件中有代码吗?如果是,那么添加以下内容可能会有所帮助。

if (!Page.IsPostBack)
{ //do something }

当您单击命令并且再次运行 Page_load 时会引发此错误,在正常的生命周期中它会是 Page_Load -> 单击命令 -> Page_Load(再次)-> 处理 ItemCommand 事件

【讨论】:

  • 啊哈!非常感谢,这就是我的窍门!我在页面加载中重新加载了一个下拉列表,因此框架失去了对 ddl 中项目(新项目)的控制,以及我单击的项目(不再存在)
  • 我遇到了与 OP 相同的错误...我在表单中使用了向导,并且在页面加载中调用了 0 步骤。删除它,问题就消失了。谢谢...
  • 非常感谢这个答案....遇到了同样的问题,结果我只是忘记在将数据加载到我的网格时忽略回发...节省了我很多时间跨度>
  • 呃!从 MVC 回到 Web 表单是一件痛苦的事情。这是正确答案
  • 我这样做了,但它对我不起作用,因为当它不是回发时,我必须在 page_load 事件中运行代码,所以我仍然遇到同样的错误。禁用我的转发器的视图状态反而解决了这个问题。
【解决方案2】:

问题是 ASP.NET 不知道这个额外的或删除的列表项。 您有多种选择(如下所列):

  • 禁用事件验证(坏主意,因为您会损失一点安全性,但代价很小)。
  • 使用 ASP.NET Ajax 更新面板。 (如果您添加或删除列表框,请将列表框放在更新面板中并触发更新。这样视图状态和相关字段将获得更新,并且事件验证将通过。)
  • 忘记客户端并使用经典回发并在服务器端添加或删除列表项。

我希望这会有所帮助。

【讨论】:

  • 另一种选择:实现IPostBackEventHandler并调用js __doPostBack('',arg)
  • 根据上面的建议,我将下拉菜单放在常规的 ASP.NET asp:UpdatePanel 中,在后面的代码中加载下拉菜单,然后使用 upNewRecord.Update();
【解决方案3】:

我有使用 DataGrid 的经验。其中一列是“选择”按钮。当我单击任何行的“选择”按钮时,我收到了以下错误消息:

“无效的回发或回调参数。事件验证在配置中启用或 在一个页面中。出于安全目的,此功能验证回发的参数或 回调事件源自最初呈现它们的服务器控件。如果数据有效且符合预期,请使用 ClientScriptManager.RegisterForEventValidation 方法,以便注册回发或回调数据以进行验证。"

我改了几个代码,终于成功了。我的体验路线:

1) 我将页面属性更改为EnableEventValidation="false"但它没有用。(这不仅危险 出于安全原因,我的事件处理程序没有被调用:void Grid_SelectedIndexChanged(object sender, EventArgs e)

2) 我在 Render 方法中实现了ClientScript.RegisterForEventValidation但是没有用。

protected override void Render(HtmlTextWriter writer)
{
    foreach (DataGridItem item in this.Grid.Items)
    {
        Page.ClientScript.RegisterForEventValidation(item.UniqueID);
        foreach (TableCell cell in (item as TableRow).Cells)
        {
            Page.ClientScript.RegisterForEventValidation(cell.UniqueID);
            foreach (System.Web.UI.Control control in cell.Controls)
            {
                if (control is Button)
                    Page.ClientScript.RegisterForEventValidation(control.UniqueID);
            }
        }
    }
}

3) 我将网格列中的按钮类型从PushButton 更改为LinkButton成功了! ("ButtonType="LinkBut​​ton")。我认为如果您可以在其他情况下将按钮更改为其他控件,例如“LinkBut​​ton”,它将正常工作。

【讨论】:

  • 我的解决方案是放弃数据网格中的嵌套按钮。 MS 又让我失望了。
  • 您的解决方案也适用于我。谢谢你。但我想知道为什么Button 在同一程序中工作时linkButton 不工作。如果是这样,我们是否总是需要使用 linkButton ?我们怎样才能变得更灵活?
  • 尝试添加到您的按钮 UseSubmitBehavior="False" stackoverflow.com/questions/2968525/…
  • Awesomeeeeeee :) .. 你只能通过经验来学习这个.. 你证明了真实的场景 tat show 经验是最好的老师.. 很棒的答案和解释!
  • 在 Render 的覆盖中,您必须放置 base.Render(writer);最后...否则将无法正常工作!
【解决方案4】:

你真的想要做 2 或 3,不要禁用事件验证。

向 asp:listbox 客户端添加项目有两个主要问题。

  • 首先是它会干扰事件验证。返回到服务器的不是它发送下来的。

  • 第二个是即使您禁用事件验证,当您的页面被回发时,列表框中的项目将从视图状态中重建,因此您在客户端上所做的任何更改都将丢失。原因是 asp.net 不希望在客户端上修改列表框的内容,它只希望进行选择,因此它会丢弃您可能所做的任何更改。

    李>

最好的选择是最有可能使用推荐的更新面板。如果您确实需要在客户端执行此操作,另一种选择是使用普通的旧&lt;select&gt; 而不是&lt;asp:ListBox&gt;,并将您的项目列表保存在隐藏字段中。当页面在客户端上呈现时,您可以从文本字段内容的拆分中填充它。

然后,当您准备发布它时,您从修改后的&lt;select&gt; 重新填充隐藏字段的内容。然后,当然,你必须在服务器上再次拆分它并对你的项目做一些事情,因为你的选择现在是空的,现在它又回到了服务器上。

总而言之,这是一个非常麻烦的解决方案,我不会真正推荐它,但如果您真的需要对 listBox 进行客户端修改,它确实有效。不过,我真的建议您在走这条路线之前先查看 updatePanel。

【讨论】:

  • c,您不需要将所选项目保留在隐藏字段中,如果您使选择框 runat="server" 您可以从 Request.Form[selectid.UnqiueID]。如果选择了多个,浏览器会将值作为 csv 发布。请注意,控件的 items 和 selectedindex 属性在服务器上会出错,因为您在客户端上修改了服务器不知道的 itrmlist。
  • 迈克尔,这行得通。只要您添加“multiple = true”,否则它只会给您1个值。谢谢
  • 对于带有换行符的下拉列表也有同样的问题。更改为 select 效果很好。谢谢!
  • 我使用了普通的旧&lt;select&gt;,解决了这个问题。与客户端 ajax 数据加载相比,您能否告诉我为什么 Updatepanel 需要花费大量时间来加载数据。?
【解决方案5】:

以上都不适合我。经过更多挖掘后,我意识到我忽略了导致问题的页面上应用的 2 个表单。

<body>
<form id="form1" runat="server">
<div>
        <form action="#" method="post" class="form" role="form">
        <div>
        ...
        <asp:Button ID="submitButton" runat="server"
        </div>
</div>
</body>

请注意,最近 ASP.NET 已开始考虑将 iframe 包含在 iframe 文档中的表单标记中,该 iframe 文档本身包含一个嵌套框架。我不得不将 iframe 移出表单标签以避免此错误。

【讨论】:

    【解决方案6】:

    我在使用Repeater 时遇到了同样的问题,因为我在启用了EnableEventValidation 的网站中有一个带有Repeater 控件的网页。这不好。我收到了无效的回发相关异常。

    对我有用的是为中继器设置 EnableViewState="false"。优点是使用起来更简单,就像为网站或网页关闭事件验证一样简单,但范围比为两者都关闭事件验证要小得多。

    【讨论】:

    • 我在使用旧版 Web 控件时遇到了这个问题。我们的网络平台 / CMS (sitecore) 进行了重大更新,开启了事件验证(之前它已关闭!哎哟!)。中继器控件在 Web 画廊中显示图像(带有重新排列它们的按钮),并且在这些按钮的回发时会发生异常。我按照您的建议使用 EnableViewState="false" 禁用了转发器上的视图状态,嘿,它很快就起作用了。正如其他人发现的那样,覆盖 Render() 和使用 ClientScriptManager.RegisterForEventValidation() 对我不起作用。谢谢!
    • 像 @xan 我也使用 Sitecore,这正是我所需要的。
    • 这对我也有用。 AJAX 更新面板也可以正常工作,但在这种情况下我不需要它的开销,所以谢谢 Umar Farooq Khawaja。
    【解决方案7】:

    在客户端上使用 JavaScript 修改 ListBox 时,我遇到了同样的问题。当您从客户端向 ListBox 添加在呈现页面时不存在的新项目时,会发生这种情况。

    我找到的解决方法是通知事件验证系统所有可以从客户端添加的可能有效项目。您可以通过覆盖 Page.Render 并为您的 JavaScript 可以添加到列表框中的每个值调用 Page.ClientScript.RegisterForEventValidation 来做到这一点:

    protected override void Render(HtmlTextWriter writer)
    {
        foreach (string val in allPossibleListBoxValues)
        {
            Page.ClientScript.RegisterForEventValidation(myListBox.UniqueID, val);
        }
        base.Render(writer);
    }
    

    如果列表框有大量潜在的有效值,这可能会有点麻烦。在我的例子中,我在两个 ListBox 之间移动项目——一个具有所有可能的值,另一个最初是空的,但当用户单击按钮时,会填充 JavaScript 中第一个值的子集。在这种情况下,您只需要遍历第一个 ListBox 中的项目并将每个项目注册到第二个列表框中:

    protected override void Render(HtmlTextWriter writer)
    {
        foreach (ListItem i in listBoxAll.Items)
        {
            Page.ClientScript.RegisterForEventValidation(listBoxSelected.UniqueID, i.Value);
        }
        base.Render(writer);
    }
    

    【讨论】:

      【解决方案8】:

      这里没有提到的另一种方法是继承 ListBox

      即。

      public class ListBoxNoEventValidation : ListBox 
      {
      }
      

      ClientEventValidation 关闭属性 System.Web.UI.SupportsEventValidation 如果您将其子类化,除非您明确将其重新添加,否则它将永远不会调用验证例程。这适用于任何控件,并且是我发现在逐个控件的基础上“禁用”它的唯一方法(即,不是页面级别)。

      【讨论】:

      • 很好地描述了here
      • 我认为最好的解决方法是这样做。我们应该在控件级别而不是页面级别上对其进行修复,并冒着涉及所有控件的安全风险 +1 并感谢@PavelHodek 提供该链接。
      • 不幸的是,如果你这样做,任何添加到客户端的列表项如果在页面回发时被选中,将不会被识别。
      【解决方案9】:

      您在 .aspx 页面中尝试类似的操作

      添加

      EnableEventValidation="false"

      您可以随时提出任何问题!

      【讨论】:

      • 我会争辩说,在这种情况下,如果禁用框架的内置验证功能以停止看到错误将是最合适的解决方案。
      【解决方案10】:

      如果您通过客户端脚本填写 DropdownList,则在将表单提交回服务器之前清除列表;那么 ASP.NET 将不会抱怨,安全性仍将开启。

      要从 DDL 中获取数据,您可以将“OnChange”事件附加到 DDL 以在隐藏的 Input 或 Style="display: none;" 的文本框中收集值

      【讨论】:

      • +1 易于实施。可能不是最干净的,但足够简单。
      【解决方案11】:

      3:我更改了网格中的按钮类型 从“PushButton”列到 “链接按钮”。有效! ("ButtonType="LinkBut​​ton") 我想如果 您可以将按钮更改为其他 其他控件中的“LinkBut​​ton” 情况下,它会正常工作。

      我希望我能给你投票,Amir(可惜我的代表太低了。)我只是遇到了这个问题,改变它就像我的 gridview 上的冠军一样。顺便说一句,我认为有效的代码是:ButtonType="Link"

      我怀疑这是因为当您单击“编辑”时,您的编辑更改为“更新”和“取消”,然后在提交时又变回“编辑”。而这些不断变化的控件让 .net 感到不安。

      【讨论】:

      • 这个问题的症结在于asp.net的eventvalidation模型,以及回发时客户端是否修改了“页面”。你是什​​么意思'.....这些不断变化的控制让.net不安'??
      【解决方案12】:

      (1) EnableEventValidation="false"......................它对我不起作用。

      (2) ClientScript.RegisterForEventValidation....它对我不起作用。

      解决方案 1:

      在 GridView 中将 Button/ImageButton 更改为 LinkBut​​ton。有用。 (但我喜欢ImageButton)

      研究:Button/ImageButton和LinkBut​​ton使用不同的方式回发

      原文:

      http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx

      解决方案 2:

      在 OnInit() 中,输入类似这样的代码来设置 Button/ImageButton 的唯一 ID:

      protected override void OnInit(EventArgs e) {
        foreach (GridViewRow grdRw in gvEvent.Rows) {
      
        Button deleteButton = (Button)grdRw.Cells[2].Controls[1];
      
        deleteButton.ID = "btnDelete_" + grdRw.RowIndex.ToString();           
        }
      }
      

      原文:

      http://www.c-sharpcorner.com/Forums/Thread/35301/

      【讨论】:

        【解决方案13】:

        我实现了一个嵌套的网格视图,我遇到了同样的问题。我使用 LinkBut​​ton 而不是这样的图像按钮:

        在我有这样的专栏之前:

        <asp:TemplateField ItemStyle-Width="9">
          <ItemTemplate>
         <asp:ImageButton ID="ImgBtn" ImageUrl="Include/images/gridplus.gif" CommandName="Expand"
                                runat="server" />
          </ItemTemplate>
        </asp:TemplateField>
        

        我已经换成这样了。

        <asp:TemplateField>
        <ItemTemplate>
             <asp:LinkButton  CommandName="Expand" ID="lnkBtn"  runat="server" ><asp:Image  ID="Img"  runat="server" ImageUrl="~/Images/app/plus.gif" /></asp:LinkButton>
              </ItemTemplate>
        </asp:TemplateField> 
        

        【讨论】:

          【解决方案14】:

          我遇到了类似的问题,但我没有使用 ASP.Net 1.1,也没有通过 javascript 更新控件。 我的问题只发生在 Firefox 而不是 IE (!)。

          我在 PreRender 事件的 DropDownList 中添加了选项,如下所示:

          DropDownList DD = (DropDownList)F.FindControl("DDlista");
          HiddenField HF = (HiddenField)F.FindControl("HFlista");
          string[] opcoes = HF.value.Split('\n');
          foreach (string opcao in opcoes) DD.Items.Add(opcao);
          

          我的“HF”(隐藏字段)的选项由换行符分隔,如下所示:

          HF.value = "option 1\n\roption 2\n\roption 3";
          

          问题在于 HTML 页面在代表 DropDown 的“选择”选项上被破坏(我的意思是有换行符)。

          所以我解决了我添加一行的问题:

          DropDownList DD = (DropDownList)F.FindControl("DDlista");
          HiddenField HF = (HiddenField)F.FindControl("HFlista");
          string dados = HF.Value.Replace("\r", "");
          string[] opcoes = dados.Split('\n');
          foreach (string opcao in opcoes) DD.Items.Add(opcao);
          

          希望这对某人有所帮助。

          【讨论】:

            【解决方案15】:

            如果您将UseSubmitBehavior="True" 更改为UseSubmitBehavior="False",您的问题将得到解决

            <asp:Button ID="BtnDis" runat="server" CommandName="BtnDis" CommandArgument='<%#Eval("Id")%>' Text="Discription" CausesValidation="True" UseSubmitBehavior="False" />
            

            【讨论】:

            • 这对我不起作用。不过,我使用的是图像按钮,并且在中继器的表格中,所以情况并不完全相同。禁用转发器的视图状态对我有用。
            【解决方案16】:

            我遇到了同样的问题,我做了什么:

            刚刚添加了一个条件if(!IsPostBack),它工作正常:)

            【讨论】:

              【解决方案17】:

              此错误将在没有回发的情况下显示

              添加代码:

              If(!IsPostBack){
              
               //do something
              
              }
              

              【讨论】:

                【解决方案18】:

                在这种情况下,将 id 添加到网格的 RowDataBound 中的按钮。它会解决你的问题。

                【讨论】:

                  【解决方案19】:

                  解决此问题的一个简单方法是在页面加载时使用 IsPostBack 检查。这样就解决了这个问题。

                  【讨论】:

                    【解决方案20】:

                    Ajax UpdatePanel 做到了,我认为这是最简单的方式,忽略了 Ajax 回发开销。

                    【讨论】:

                      【解决方案21】:

                      我知道这是一个超级旧的帖子。假设您正在调用您的应用程序,这是一个对我有用的想法:

                      1. 在您的页面上实现 ICallbackEventHandler
                      2. 调用 ClientScriptManager.GetCallbackEventReference 来调用你的服务器端代码
                      3. 如错误消息所述,您可以调用 ClientScriptManager.RegisterForEventValidation

                      如果您不需要完全控制,您可以使用更新面板来为您完成此操作。

                      【讨论】:

                        【解决方案22】:

                        我们在将常规 ASPX 页面转换为内容页面时遇到了同样的问题。

                        存在此问题的页面在其中一个内容部分中有一个 &lt;/form&gt; 标记,因此在运行时呈现了两个表单结束标记,从而导致了此问题。从页面中删除额外的表单结束标记解决了这个问题。

                        【讨论】:

                        • 谢谢,原来我的代码中还有额外的 &lt;form&gt; 字段。
                        【解决方案23】:

                        如果您使用的是 gridview 并且没有在 !ispostback 内的 pageload 处绑定 gridview,那么当您单击 gridview 中的编辑和删除行时会发生此错误。

                         protected void Page_Load(object sender, EventArgs e)
                            {
                                if (!IsPostBack)
                                {
                                bindGridview();
                                }
                        

                        【讨论】:

                          【解决方案24】:

                          四分钟前我收到了同样的错误。然后我和你一样研究了一个半小时。在所有论坛中,他们通常会说“添加页面 enableEvent..=false 或 true”。任何提出的解决方案都没有解决我的问题,直到我找到它。不幸的是,问题是一个 ASP.NET 按钮。我在两秒钟前删除了它。我试图用“imagebutton”替换,但它也是不可接受的(因为它给出了同样的错误)。

                          最后我换成了LinkButton。它似乎工作了!

                          【讨论】:

                            【解决方案25】:

                            我正在使用 datalist,但我的按钮也出现了同样的错误。我只是使用 IsPostBack 检查并填写我的控件,问题就解决了!太好了!!!

                            【讨论】:

                              【解决方案26】:

                              对我有用的是将以下代码从 page_load 移动到 page_prerender:

                              lstMain.DataBind();
                              Image img = (Image)lstMain.Items[0].FindControl("imgMain");
                              
                              // Define the name and type of the client scripts on the page.
                              String csname1 = "PopupScript";
                              Type cstype = this.GetType();
                              
                              // Get a ClientScriptManager reference from the Page class.
                              ClientScriptManager cs = Page.ClientScript;
                              
                              // Check to see if the startup script is already registered.
                              if (!cs.IsStartupScriptRegistered(cstype, csname1))
                              {
                                  cs.RegisterStartupScript(cstype, csname1, "<script language=javascript> p=\"" + img.ClientID + "\"</script>");
                              }
                              

                              【讨论】:

                                【解决方案27】:

                                最好的选择是使用隐藏字段并且不要禁用事件验证,同时更改每个列表框、下拉列表以使用 runat 服务器属性进行选择

                                【讨论】:

                                • 从 asp 控件更改为常规
                                【解决方案28】:

                                如果您使用的是 Ajax 更新面板。添加&lt;Triggers&gt; 标记并在其中触发按钮或控件使用&lt;asp:PostBackTrigger .../&gt; 导致回发

                                【讨论】:

                                  【解决方案29】:

                                  如果您事先知道可以填充的数据,则可以使用 ClientScriptManager 来解决此问题。在之前的用户选择中使用 javascript 动态填充下拉框时,我遇到了这个问题。

                                  这里是一些示例代码,用于覆盖渲染方法(在 VB 和 C# 中)并声明下拉列表 ddCar 的潜在值。

                                  在 VB 中:

                                  Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
                                  
                                      Dim ClientScript As ClientScriptManager = Page.ClientScript
                                  
                                      ClientScript.RegisterForEventValidation("ddCar", "Mercedes")
                                  
                                      MyBase.Render(writer)
                                  End Sub
                                  

                                  或 C# 中的轻微变化可能是:

                                  protected override void Render(HtmlTextWriter writer)
                                  {
                                      Page.ClientScript.RegisterForEventValidation("ddCar", "Mercedes");
                                      base.Render(writer);
                                  }
                                  

                                  对于新手:这应该放在文件后面的代码中(.vb 或 .cs),或者如果在 aspx 文件中使用,你可以用&lt;script&gt; 标签包装。

                                  【讨论】:

                                    【解决方案30】:

                                    这就是我得到它的原因:

                                    我有一个 ASP:ListBox。最初它是隐藏的。在客户端,我将通过 AJAX 使用选项填充它。用户选择了一个选项。然后,当单击提交按钮时,服务器会对 ListBox 感到很有趣,因为它不记得它有任何选项。

                                    所以我所做的是确保在将表单提交回服务器之前清除所有列表选项。这样服务器就不会抱怨,因为列表到客户端时是空的,然后又是空的。

                                    排序!!!

                                    【讨论】:

                                      猜你喜欢
                                      • 2011-03-08
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2021-11-10
                                      • 1970-01-01
                                      • 2014-11-18
                                      相关资源
                                      最近更新 更多